MCPcopy Create free account
hub / github.com/OAID/Tengine / interleave_kernel

Function interleave_kernel

executor/operator/arm64/fc/feature_match.cpp:51–89  ·  view source on GitHub ↗

interleave most kernels in 8, last 7 interleave in 2, copy the lat kernels

Source from the content-addressed store, hash-verified

49
50// interleave most kernels in 8, last 7 interleave in 2, copy the lat kernels
51void interleave_kernel(const float* kernel, const float* kernel_interleaved, int kernel_chan, int kernel_size)
52{
53 int i, j, k;
54 float* cur_kernel[8];
55 float* cur_kernel_interleaved;
56
57 // interleave 8 kernel
58 for(i = 0; i < (kernel_chan & -8); i += 8)
59 {
60 for(j = 0; j < 8; j++)
61 cur_kernel[j] = ( float* )kernel + kernel_size * (i + j);
62 cur_kernel_interleaved = ( float* )kernel_interleaved + kernel_size * i;
63 for(k = 0; k < kernel_size; k++)
64 for(j = 0; j < 8; j++)
65 cur_kernel_interleaved[8 * k + j] = *(cur_kernel[j] + k);
66 }
67
68 // interleave 2 kernel
69 for(; i < (kernel_chan & -2); i += 2)
70 {
71 for(j = 0; j < 2; j++)
72 cur_kernel[j] = ( float* )kernel + kernel_size * (i + j);
73 cur_kernel_interleaved = ( float* )kernel_interleaved + kernel_size * i;
74 for(k = 0; k < kernel_size; k++)
75 for(j = 0; j < 2; j++)
76 cur_kernel_interleaved[2 * k + j] = *(cur_kernel[j] + k);
77 }
78
79 // copy last kernel
80 if(kernel_chan & 0x1)
81 {
82 cur_kernel[0] = ( float* )kernel + kernel_size * i;
83 cur_kernel_interleaved = ( float* )kernel_interleaved + kernel_size * i;
84 for(k = 0; k < kernel_size; k++)
85 cur_kernel_interleaved[k] = *(cur_kernel[0] + k);
86 }
87
88 return;
89}
90
91// start and end channel must be 8 aligned
92void sgemv1x8(const float* input, float* weight_interleaved, bool have_biases, const float* biases, const float* output,

Callers 1

PrerunMethod · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected