xref: /aosp_15_r20/external/XNNPACK/test/bfly4-microkernel-tester.h (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2022 Google LLC
2*4bdc9457SAndroid Build Coastguard Worker //
3*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
4*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
5*4bdc9457SAndroid Build Coastguard Worker 
6*4bdc9457SAndroid Build Coastguard Worker #pragma once
7*4bdc9457SAndroid Build Coastguard Worker 
8*4bdc9457SAndroid Build Coastguard Worker #include <gtest/gtest.h>
9*4bdc9457SAndroid Build Coastguard Worker 
10*4bdc9457SAndroid Build Coastguard Worker #include <algorithm>
11*4bdc9457SAndroid Build Coastguard Worker #include <cassert>
12*4bdc9457SAndroid Build Coastguard Worker #include <cmath>
13*4bdc9457SAndroid Build Coastguard Worker #include <cstddef>
14*4bdc9457SAndroid Build Coastguard Worker #include <cstdlib>
15*4bdc9457SAndroid Build Coastguard Worker #include <random>
16*4bdc9457SAndroid Build Coastguard Worker #include <vector>
17*4bdc9457SAndroid Build Coastguard Worker 
18*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack.h>
19*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/aligned-allocator.h>
20*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/math.h>
21*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/params.h>
22*4bdc9457SAndroid Build Coastguard Worker 
23*4bdc9457SAndroid Build Coastguard Worker // twiddle table for bfly4 for fft size 256 (complex numbers)
24*4bdc9457SAndroid Build Coastguard Worker // Even numbers are numpy.floor(0.5 + 32767 * numpy.cos(-2*pi*numpy.linspace(0, 255, num=256) / 256)).astype(numpy.int16).tolist()
25*4bdc9457SAndroid Build Coastguard Worker // Odd numbers are numpy.floor(0.5 + 32767 * numpy.sin(-2*pi*numpy.linspace(0, 255, num=256) / 256)).astype(numpy.int16).tolist()
26*4bdc9457SAndroid Build Coastguard Worker 
27*4bdc9457SAndroid Build Coastguard Worker static const int16_t xnn_reference_table_fft256_twiddle[512] = {
28*4bdc9457SAndroid Build Coastguard Worker    32767,     0,  32757,  -804,  32728, -1608,  32678, -2410,
29*4bdc9457SAndroid Build Coastguard Worker    32609, -3212,  32521, -4011,  32412, -4808,  32285, -5602,
30*4bdc9457SAndroid Build Coastguard Worker    32137, -6393,  31971, -7179,  31785, -7962,  31580, -8739,
31*4bdc9457SAndroid Build Coastguard Worker    31356, -9512,  31113,-10278,  30852,-11039,  30571,-11793,
32*4bdc9457SAndroid Build Coastguard Worker    30273,-12539,  29956,-13279,  29621,-14010,  29268,-14732,
33*4bdc9457SAndroid Build Coastguard Worker    28898,-15446,  28510,-16151,  28105,-16846,  27683,-17530,
34*4bdc9457SAndroid Build Coastguard Worker    27245,-18204,  26790,-18868,  26319,-19519,  25832,-20159,
35*4bdc9457SAndroid Build Coastguard Worker    25329,-20787,  24811,-21403,  24279,-22005,  23731,-22594,
36*4bdc9457SAndroid Build Coastguard Worker    23170,-23170,  22594,-23731,  22005,-24279,  21403,-24811,
37*4bdc9457SAndroid Build Coastguard Worker    20787,-25329,  20159,-25832,  19519,-26319,  18868,-26790,
38*4bdc9457SAndroid Build Coastguard Worker    18204,-27245,  17530,-27683,  16846,-28105,  16151,-28510,
39*4bdc9457SAndroid Build Coastguard Worker    15446,-28898,  14732,-29268,  14010,-29621,  13279,-29956,
40*4bdc9457SAndroid Build Coastguard Worker    12539,-30273,  11793,-30571,  11039,-30852,  10278,-31113,
41*4bdc9457SAndroid Build Coastguard Worker     9512,-31356,   8739,-31580,   7962,-31785,   7179,-31971,
42*4bdc9457SAndroid Build Coastguard Worker     6393,-32137,   5602,-32285,   4808,-32412,   4011,-32521,
43*4bdc9457SAndroid Build Coastguard Worker     3212,-32609,   2410,-32678,   1608,-32728,    804,-32757,
44*4bdc9457SAndroid Build Coastguard Worker        0,-32767,   -804,-32757,  -1608,-32728,  -2410,-32678,
45*4bdc9457SAndroid Build Coastguard Worker    -3212,-32609,  -4011,-32521,  -4808,-32412,  -5602,-32285,
46*4bdc9457SAndroid Build Coastguard Worker    -6393,-32137,  -7179,-31971,  -7962,-31785,  -8739,-31580,
47*4bdc9457SAndroid Build Coastguard Worker    -9512,-31356, -10278,-31113, -11039,-30852, -11793,-30571,
48*4bdc9457SAndroid Build Coastguard Worker   -12539,-30273, -13279,-29956, -14010,-29621, -14732,-29268,
49*4bdc9457SAndroid Build Coastguard Worker   -15446,-28898, -16151,-28510, -16846,-28105, -17530,-27683,
50*4bdc9457SAndroid Build Coastguard Worker   -18204,-27245, -18868,-26790, -19519,-26319, -20159,-25832,
51*4bdc9457SAndroid Build Coastguard Worker   -20787,-25329, -21403,-24811, -22005,-24279, -22594,-23731,
52*4bdc9457SAndroid Build Coastguard Worker   -23170,-23170, -23731,-22594, -24279,-22005, -24811,-21403,
53*4bdc9457SAndroid Build Coastguard Worker   -25329,-20787, -25832,-20159, -26319,-19519, -26790,-18868,
54*4bdc9457SAndroid Build Coastguard Worker   -27245,-18204, -27683,-17530, -28105,-16846, -28510,-16151,
55*4bdc9457SAndroid Build Coastguard Worker   -28898,-15446, -29268,-14732, -29621,-14010, -29956,-13279,
56*4bdc9457SAndroid Build Coastguard Worker   -30273,-12539, -30571,-11793, -30852,-11039, -31113,-10278,
57*4bdc9457SAndroid Build Coastguard Worker   -31356, -9512, -31580, -8739, -31785, -7962, -31971, -7179,
58*4bdc9457SAndroid Build Coastguard Worker   -32137, -6393, -32285, -5602, -32412, -4808, -32521, -4011,
59*4bdc9457SAndroid Build Coastguard Worker   -32609, -3212, -32678, -2410, -32728, -1608, -32757,  -804,
60*4bdc9457SAndroid Build Coastguard Worker   -32767,     0, -32757,   804, -32728,  1608, -32678,  2410,
61*4bdc9457SAndroid Build Coastguard Worker   -32609,  3212, -32521,  4011, -32412,  4808, -32285,  5602,
62*4bdc9457SAndroid Build Coastguard Worker   -32137,  6393, -31971,  7179, -31785,  7962, -31580,  8739,
63*4bdc9457SAndroid Build Coastguard Worker   -31356,  9512, -31113, 10278, -30852, 11039, -30571, 11793,
64*4bdc9457SAndroid Build Coastguard Worker   -30273, 12539, -29956, 13279, -29621, 14010, -29268, 14732,
65*4bdc9457SAndroid Build Coastguard Worker   -28898, 15446, -28510, 16151, -28105, 16846, -27683, 17530,
66*4bdc9457SAndroid Build Coastguard Worker   -27245, 18204, -26790, 18868, -26319, 19519, -25832, 20159,
67*4bdc9457SAndroid Build Coastguard Worker   -25329, 20787, -24811, 21403, -24279, 22005, -23731, 22594,
68*4bdc9457SAndroid Build Coastguard Worker   -23170, 23170, -22594, 23731, -22005, 24279, -21403, 24811,
69*4bdc9457SAndroid Build Coastguard Worker   -20787, 25329, -20159, 25832, -19519, 26319, -18868, 26790,
70*4bdc9457SAndroid Build Coastguard Worker   -18204, 27245, -17530, 27683, -16846, 28105, -16151, 28510,
71*4bdc9457SAndroid Build Coastguard Worker   -15446, 28898, -14732, 29268, -14010, 29621, -13279, 29956,
72*4bdc9457SAndroid Build Coastguard Worker   -12539, 30273, -11793, 30571, -11039, 30852, -10278, 31113,
73*4bdc9457SAndroid Build Coastguard Worker    -9512, 31356,  -8739, 31580,  -7962, 31785,  -7179, 31971,
74*4bdc9457SAndroid Build Coastguard Worker    -6393, 32137,  -5602, 32285,  -4808, 32412,  -4011, 32521,
75*4bdc9457SAndroid Build Coastguard Worker    -3212, 32609,  -2410, 32678,  -1608, 32728,   -804, 32757,
76*4bdc9457SAndroid Build Coastguard Worker        0, 32767,    804, 32757,   1608, 32728,   2410, 32678,
77*4bdc9457SAndroid Build Coastguard Worker     3212, 32609,   4011, 32521,   4808, 32412,   5602, 32285,
78*4bdc9457SAndroid Build Coastguard Worker     6393, 32137,   7179, 31971,   7962, 31785,   8739, 31580,
79*4bdc9457SAndroid Build Coastguard Worker     9512, 31356,  10278, 31113,  11039, 30852,  11793, 30571,
80*4bdc9457SAndroid Build Coastguard Worker    12539, 30273,  13279, 29956,  14010, 29621,  14732, 29268,
81*4bdc9457SAndroid Build Coastguard Worker    15446, 28898,  16151, 28510,  16846, 28105,  17530, 27683,
82*4bdc9457SAndroid Build Coastguard Worker    18204, 27245,  18868, 26790,  19519, 26319,  20159, 25832,
83*4bdc9457SAndroid Build Coastguard Worker    20787, 25329,  21403, 24811,  22005, 24279,  22594, 23731,
84*4bdc9457SAndroid Build Coastguard Worker    23170, 23170,  23731, 22594,  24279, 22005,  24811, 21403,
85*4bdc9457SAndroid Build Coastguard Worker    25329, 20787,  25832, 20159,  26319, 19519,  26790, 18868,
86*4bdc9457SAndroid Build Coastguard Worker    27245, 18204,  27683, 17530,  28105, 16846,  28510, 16151,
87*4bdc9457SAndroid Build Coastguard Worker    28898, 15446,  29268, 14732,  29621, 14010,  29956, 13279,
88*4bdc9457SAndroid Build Coastguard Worker    30273, 12539,  30571, 11793,  30852, 11039,  31113, 10278,
89*4bdc9457SAndroid Build Coastguard Worker    31356,  9512,  31580,  8739,  31785,  7962,  31971,  7179,
90*4bdc9457SAndroid Build Coastguard Worker    32137,  6393,  32285,  5602,  32412,  4808,  32521,  4011,
91*4bdc9457SAndroid Build Coastguard Worker    32609,  3212,  32678,  2410,  32728,  1608,  32757,   804
92*4bdc9457SAndroid Build Coastguard Worker };
93*4bdc9457SAndroid Build Coastguard Worker 
xnn_cs16_bfly4_reference(size_t samples,int16_t * data,const size_t stride,const int16_t * twiddle)94*4bdc9457SAndroid Build Coastguard Worker void xnn_cs16_bfly4_reference(
95*4bdc9457SAndroid Build Coastguard Worker     size_t samples,
96*4bdc9457SAndroid Build Coastguard Worker     int16_t* data,
97*4bdc9457SAndroid Build Coastguard Worker     const size_t stride,
98*4bdc9457SAndroid Build Coastguard Worker     const int16_t* twiddle) {
99*4bdc9457SAndroid Build Coastguard Worker 
100*4bdc9457SAndroid Build Coastguard Worker   const int16_t* tw1 = twiddle;
101*4bdc9457SAndroid Build Coastguard Worker   const int16_t* tw2 = tw1;
102*4bdc9457SAndroid Build Coastguard Worker   const int16_t* tw3 = tw1;
103*4bdc9457SAndroid Build Coastguard Worker   int16_t* out0 = data;
104*4bdc9457SAndroid Build Coastguard Worker   int16_t* out1 = data + samples * 2;
105*4bdc9457SAndroid Build Coastguard Worker   int16_t* out2 = data + samples * 4;
106*4bdc9457SAndroid Build Coastguard Worker   int16_t* out3 = data + samples * 6;
107*4bdc9457SAndroid Build Coastguard Worker 
108*4bdc9457SAndroid Build Coastguard Worker   assert(samples != 0);
109*4bdc9457SAndroid Build Coastguard Worker   assert(stride != 0);
110*4bdc9457SAndroid Build Coastguard Worker   assert(twiddle != NULL);
111*4bdc9457SAndroid Build Coastguard Worker   assert(data != NULL);
112*4bdc9457SAndroid Build Coastguard Worker 
113*4bdc9457SAndroid Build Coastguard Worker   do {
114*4bdc9457SAndroid Build Coastguard Worker       int32_t vout0_r = (int32_t) out0[0];
115*4bdc9457SAndroid Build Coastguard Worker       int32_t vout0_i = (int32_t) out0[1];
116*4bdc9457SAndroid Build Coastguard Worker       int32_t vout1_r = (int32_t) out1[0];
117*4bdc9457SAndroid Build Coastguard Worker       int32_t vout1_i = (int32_t) out1[1];
118*4bdc9457SAndroid Build Coastguard Worker       int32_t vout2_r = (int32_t) out2[0];
119*4bdc9457SAndroid Build Coastguard Worker       int32_t vout2_i = (int32_t) out2[1];
120*4bdc9457SAndroid Build Coastguard Worker       int32_t vout3_r = (int32_t) out3[0];
121*4bdc9457SAndroid Build Coastguard Worker       int32_t vout3_i = (int32_t) out3[1];
122*4bdc9457SAndroid Build Coastguard Worker 
123*4bdc9457SAndroid Build Coastguard Worker       const int32_t tw1_r = (const int32_t) tw1[0];
124*4bdc9457SAndroid Build Coastguard Worker       const int32_t tw1_i = (const int32_t) tw1[1];
125*4bdc9457SAndroid Build Coastguard Worker       const int32_t tw2_r = (const int32_t) tw2[0];
126*4bdc9457SAndroid Build Coastguard Worker       const int32_t tw2_i = (const int32_t) tw2[1];
127*4bdc9457SAndroid Build Coastguard Worker       const int32_t tw3_r = (const int32_t) tw3[0];
128*4bdc9457SAndroid Build Coastguard Worker       const int32_t tw3_i = (const int32_t) tw3[1];
129*4bdc9457SAndroid Build Coastguard Worker 
130*4bdc9457SAndroid Build Coastguard Worker       // Note 32767 / 4 = 8191.  Should be 8192.
131*4bdc9457SAndroid Build Coastguard Worker       vout0_r = (vout0_r * 8191 + 16384) >> 15;
132*4bdc9457SAndroid Build Coastguard Worker       vout0_i = (vout0_i * 8191 + 16384) >> 15;
133*4bdc9457SAndroid Build Coastguard Worker       vout1_r = (vout1_r * 8191 + 16384) >> 15;
134*4bdc9457SAndroid Build Coastguard Worker       vout1_i = (vout1_i * 8191 + 16384) >> 15;
135*4bdc9457SAndroid Build Coastguard Worker       vout2_r = (vout2_r * 8191 + 16384) >> 15;
136*4bdc9457SAndroid Build Coastguard Worker       vout2_i = (vout2_i * 8191 + 16384) >> 15;
137*4bdc9457SAndroid Build Coastguard Worker       vout3_r = (vout3_r * 8191 + 16384) >> 15;
138*4bdc9457SAndroid Build Coastguard Worker       vout3_i = (vout3_i * 8191 + 16384) >> 15;
139*4bdc9457SAndroid Build Coastguard Worker 
140*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp0_r = math_asr_s32(vout1_r * tw1_r - vout1_i * tw1_i + 16384, 15);
141*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp0_i = math_asr_s32(vout1_r * tw1_i + vout1_i * tw1_r + 16384, 15);
142*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp1_r = math_asr_s32(vout2_r * tw2_r - vout2_i * tw2_i + 16384, 15);
143*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp1_i = math_asr_s32(vout2_r * tw2_i + vout2_i * tw2_r + 16384, 15);
144*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp2_r = math_asr_s32(vout3_r * tw3_r - vout3_i * tw3_i + 16384, 15);
145*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp2_i = math_asr_s32(vout3_r * tw3_i + vout3_i * tw3_r + 16384, 15);
146*4bdc9457SAndroid Build Coastguard Worker 
147*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp5_r = vout0_r - vtmp1_r;
148*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp5_i = vout0_i - vtmp1_i;
149*4bdc9457SAndroid Build Coastguard Worker       vout0_r  += vtmp1_r;
150*4bdc9457SAndroid Build Coastguard Worker       vout0_i  += vtmp1_i;
151*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp3_r = vtmp0_r + vtmp2_r;
152*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp3_i = vtmp0_i + vtmp2_i;
153*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp4_r = vtmp0_r - vtmp2_r;
154*4bdc9457SAndroid Build Coastguard Worker       const int32_t vtmp4_i = vtmp0_i - vtmp2_i;
155*4bdc9457SAndroid Build Coastguard Worker       vout2_r = vout0_r - vtmp3_r;
156*4bdc9457SAndroid Build Coastguard Worker       vout2_i = vout0_i - vtmp3_i;
157*4bdc9457SAndroid Build Coastguard Worker 
158*4bdc9457SAndroid Build Coastguard Worker       tw1 += stride * 2;
159*4bdc9457SAndroid Build Coastguard Worker       tw2 += stride * 4;
160*4bdc9457SAndroid Build Coastguard Worker       tw3 += stride * 6;
161*4bdc9457SAndroid Build Coastguard Worker       vout0_r += vtmp3_r;
162*4bdc9457SAndroid Build Coastguard Worker       vout0_i += vtmp3_i;
163*4bdc9457SAndroid Build Coastguard Worker 
164*4bdc9457SAndroid Build Coastguard Worker       vout1_r = vtmp5_r + vtmp4_i;
165*4bdc9457SAndroid Build Coastguard Worker       vout1_i = vtmp5_i - vtmp4_r;
166*4bdc9457SAndroid Build Coastguard Worker       vout3_r = vtmp5_r - vtmp4_i;
167*4bdc9457SAndroid Build Coastguard Worker       vout3_i = vtmp5_i + vtmp4_r;
168*4bdc9457SAndroid Build Coastguard Worker 
169*4bdc9457SAndroid Build Coastguard Worker       out0[0] = (int16_t) vout0_r;
170*4bdc9457SAndroid Build Coastguard Worker       out0[1] = (int16_t) vout0_i;
171*4bdc9457SAndroid Build Coastguard Worker       out1[0] = (int16_t) vout1_r;
172*4bdc9457SAndroid Build Coastguard Worker       out1[1] = (int16_t) vout1_i;
173*4bdc9457SAndroid Build Coastguard Worker       out2[0] = (int16_t) vout2_r;
174*4bdc9457SAndroid Build Coastguard Worker       out2[1] = (int16_t) vout2_i;
175*4bdc9457SAndroid Build Coastguard Worker       out3[0] = (int16_t) vout3_r;
176*4bdc9457SAndroid Build Coastguard Worker       out3[1] = (int16_t) vout3_i;
177*4bdc9457SAndroid Build Coastguard Worker       out0 += 2;
178*4bdc9457SAndroid Build Coastguard Worker       out1 += 2;
179*4bdc9457SAndroid Build Coastguard Worker       out2 += 2;
180*4bdc9457SAndroid Build Coastguard Worker       out3 += 2;
181*4bdc9457SAndroid Build Coastguard Worker   } while(--samples != 0);
182*4bdc9457SAndroid Build Coastguard Worker }
183*4bdc9457SAndroid Build Coastguard Worker 
184*4bdc9457SAndroid Build Coastguard Worker class BFly4MicrokernelTester {
185*4bdc9457SAndroid Build Coastguard Worker  public:
samples(size_t samples)186*4bdc9457SAndroid Build Coastguard Worker   inline BFly4MicrokernelTester& samples(size_t samples) {
187*4bdc9457SAndroid Build Coastguard Worker     assert(samples != 0);
188*4bdc9457SAndroid Build Coastguard Worker     this->samples_ = samples;
189*4bdc9457SAndroid Build Coastguard Worker     return *this;
190*4bdc9457SAndroid Build Coastguard Worker   }
191*4bdc9457SAndroid Build Coastguard Worker 
samples()192*4bdc9457SAndroid Build Coastguard Worker   inline size_t samples() const {
193*4bdc9457SAndroid Build Coastguard Worker     return this->samples_;
194*4bdc9457SAndroid Build Coastguard Worker   }
195*4bdc9457SAndroid Build Coastguard Worker 
stride(uint32_t stride)196*4bdc9457SAndroid Build Coastguard Worker   inline BFly4MicrokernelTester& stride(uint32_t stride) {
197*4bdc9457SAndroid Build Coastguard Worker     this->stride_ = stride;
198*4bdc9457SAndroid Build Coastguard Worker     return *this;
199*4bdc9457SAndroid Build Coastguard Worker   }
200*4bdc9457SAndroid Build Coastguard Worker 
stride()201*4bdc9457SAndroid Build Coastguard Worker   inline uint32_t stride() const {
202*4bdc9457SAndroid Build Coastguard Worker     return this->stride_;
203*4bdc9457SAndroid Build Coastguard Worker   }
204*4bdc9457SAndroid Build Coastguard Worker 
iterations(size_t iterations)205*4bdc9457SAndroid Build Coastguard Worker   inline BFly4MicrokernelTester& iterations(size_t iterations) {
206*4bdc9457SAndroid Build Coastguard Worker     this->iterations_ = iterations;
207*4bdc9457SAndroid Build Coastguard Worker     return *this;
208*4bdc9457SAndroid Build Coastguard Worker   }
209*4bdc9457SAndroid Build Coastguard Worker 
iterations()210*4bdc9457SAndroid Build Coastguard Worker   inline size_t iterations() const {
211*4bdc9457SAndroid Build Coastguard Worker     return this->iterations_;
212*4bdc9457SAndroid Build Coastguard Worker   }
213*4bdc9457SAndroid Build Coastguard Worker 
Test(xnn_cs16_bfly4_ukernel_function bfly4)214*4bdc9457SAndroid Build Coastguard Worker   void Test(xnn_cs16_bfly4_ukernel_function bfly4) const {
215*4bdc9457SAndroid Build Coastguard Worker     std::random_device random_device;
216*4bdc9457SAndroid Build Coastguard Worker     auto rng = std::mt19937(random_device());
217*4bdc9457SAndroid Build Coastguard Worker     auto i16rng = std::bind(std::uniform_int_distribution<int16_t>(), std::ref(rng));
218*4bdc9457SAndroid Build Coastguard Worker     const size_t fft_size = (samples() == 1 ? 1 : (samples() * stride())) * 4;  // 4 for bfly4.
219*4bdc9457SAndroid Build Coastguard Worker 
220*4bdc9457SAndroid Build Coastguard Worker     // 256 complex numbers = fft_size * 2 = 512
221*4bdc9457SAndroid Build Coastguard Worker     std::vector<int16_t> y(fft_size * 2);
222*4bdc9457SAndroid Build Coastguard Worker     std::vector<int16_t> y_ref(fft_size * 2);
223*4bdc9457SAndroid Build Coastguard Worker 
224*4bdc9457SAndroid Build Coastguard Worker     for (size_t iteration = 0; iteration < iterations(); iteration++) {
225*4bdc9457SAndroid Build Coastguard Worker       std::generate(y.begin(), y.end(), std::ref(i16rng));
226*4bdc9457SAndroid Build Coastguard Worker       y_ref = y;
227*4bdc9457SAndroid Build Coastguard Worker 
228*4bdc9457SAndroid Build Coastguard Worker       // Compute reference results.
229*4bdc9457SAndroid Build Coastguard Worker       xnn_cs16_bfly4_reference(samples(), y_ref.data(), stride(), xnn_reference_table_fft256_twiddle);
230*4bdc9457SAndroid Build Coastguard Worker 
231*4bdc9457SAndroid Build Coastguard Worker       // Call optimized micro-kernel.
232*4bdc9457SAndroid Build Coastguard Worker       bfly4(samples(), y.data(), stride(), xnn_reference_table_fft256_twiddle);
233*4bdc9457SAndroid Build Coastguard Worker 
234*4bdc9457SAndroid Build Coastguard Worker       // Verify results.
235*4bdc9457SAndroid Build Coastguard Worker       for (size_t n = 0; n < fft_size * 2; n++) {
236*4bdc9457SAndroid Build Coastguard Worker         ASSERT_EQ(y[n], y_ref[n])
237*4bdc9457SAndroid Build Coastguard Worker             << "at sample " << n << " / " << fft_size
238*4bdc9457SAndroid Build Coastguard Worker             << "\nsamples " << samples()
239*4bdc9457SAndroid Build Coastguard Worker             << "\nstride " << stride();
240*4bdc9457SAndroid Build Coastguard Worker       }
241*4bdc9457SAndroid Build Coastguard Worker     }
242*4bdc9457SAndroid Build Coastguard Worker   }
243*4bdc9457SAndroid Build Coastguard Worker 
244*4bdc9457SAndroid Build Coastguard Worker  private:
245*4bdc9457SAndroid Build Coastguard Worker   size_t samples_{1};
246*4bdc9457SAndroid Build Coastguard Worker   uint32_t stride_{1};
247*4bdc9457SAndroid Build Coastguard Worker   size_t iterations_{15};
248*4bdc9457SAndroid Build Coastguard Worker };
249