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

Function interleave_kernel

executor/operator/arm64/fc/fully_connected_fast.cpp:50–88  ·  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

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