1 #include "BasicTestsF16.h"
2 #include <stdio.h>
3 #include "Error.h"
4 
5 
6 #define SNR_THRESHOLD 62
7 #define SNR_DOTPROD_THRESHOLD 40
8 
9 /*
10 
11 Reference patterns are generated with
12 a double precision computation.
13 
14 */
15 #define REL_ERROR (4e-2)
16 
17 
18 #define GET_F16_PTR() \
19 const float16_t *inp1=input1.ptr(); \
20 const float16_t *inp2=input2.ptr(); \
21 float16_t *outp=output.ptr();
22 
test_add_f16()23     void BasicTestsF16::test_add_f16()
24     {
25         GET_F16_PTR();
26 
27         arm_add_f16(inp1,inp2,outp,input1.nbSamples());
28 
29         ASSERT_EMPTY_TAIL(output);
30 
31         ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
32 
33         ASSERT_REL_ERROR(output,ref,REL_ERROR);
34 
35     }
36 
test_clip_f16()37     void BasicTestsF16::test_clip_f16()
38     {
39         const float16_t *inp=input1.ptr();
40         float16_t *outp=output.ptr();
41 
42         arm_clip_f16(inp,outp,this->min, this->max,input1.nbSamples());
43 
44         ASSERT_EMPTY_TAIL(output);
45 
46         ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
47 
48         ASSERT_REL_ERROR(output,ref,REL_ERROR);
49 
50     }
51 
test_sub_f16()52     void BasicTestsF16::test_sub_f16()
53     {
54 
55         GET_F16_PTR();
56 
57         arm_sub_f16(inp1,inp2,outp,input1.nbSamples());
58 
59         ASSERT_EMPTY_TAIL(output);
60 
61         ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
62 
63         ASSERT_REL_ERROR(output,ref,REL_ERROR);
64 
65     }
66 
test_mult_f16()67     void BasicTestsF16::test_mult_f16()
68     {
69 
70         GET_F16_PTR();
71 
72         arm_mult_f16(inp1,inp2,outp,input1.nbSamples());
73 
74         ASSERT_EMPTY_TAIL(output);
75 
76         ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
77 
78         ASSERT_REL_ERROR(output,ref,REL_ERROR);
79 
80     }
81 
test_negate_f16()82     void BasicTestsF16::test_negate_f16()
83     {
84 
85         GET_F16_PTR();
86 
87         (void)inp2;
88 
89         arm_negate_f16(inp1,outp,input1.nbSamples());
90 
91         ASSERT_EMPTY_TAIL(output);
92 
93         ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
94 
95         ASSERT_REL_ERROR(output,ref,REL_ERROR);
96 
97     }
98 
test_offset_f16()99     void BasicTestsF16::test_offset_f16()
100     {
101 
102         GET_F16_PTR();
103 
104         (void)inp2;
105 
106         arm_offset_f16(inp1,0.5,outp,input1.nbSamples());
107 
108         ASSERT_EMPTY_TAIL(output);
109 
110         ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
111 
112         ASSERT_REL_ERROR(output,ref,REL_ERROR);
113 
114     }
115 
test_scale_f16()116     void BasicTestsF16::test_scale_f16()
117     {
118 
119         GET_F16_PTR();
120 
121         (void)inp2;
122 
123         arm_scale_f16(inp1,0.5,outp,input1.nbSamples());
124 
125         ASSERT_EMPTY_TAIL(output);
126 
127         ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
128 
129         ASSERT_REL_ERROR(output,ref,REL_ERROR);
130 
131     }
132 
test_dot_prod_f16()133     void BasicTestsF16::test_dot_prod_f16()
134     {
135 
136         float16_t r;
137 
138         GET_F16_PTR();
139 
140         arm_dot_prod_f16(inp1,inp2,input1.nbSamples(),&r);
141 
142         outp[0] = r;
143 
144         ASSERT_SNR(output,ref,(float16_t)SNR_DOTPROD_THRESHOLD);
145 
146         ASSERT_REL_ERROR(output,ref,REL_ERROR);
147 
148         ASSERT_EMPTY_TAIL(output);
149 
150 
151     }
152 
test_abs_f16()153     void BasicTestsF16::test_abs_f16()
154     {
155 
156         GET_F16_PTR();
157 
158         (void)inp2;
159 
160         arm_abs_f16(inp1,outp,input1.nbSamples());
161 
162         ASSERT_EMPTY_TAIL(output);
163 
164         ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD);
165 
166         ASSERT_REL_ERROR(output,ref,REL_ERROR);
167 
168     }
169 
170 
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)171     void BasicTestsF16::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
172     {
173 
174        Testing::nbSamples_t nb=MAX_NB_SAMPLES;
175 
176        (void)params;
177 
178        switch(id)
179        {
180         case BasicTestsF16::TEST_ADD_F16_1:
181           nb = 7;
182           ref.reload(BasicTestsF16::REF_ADD_F16_ID,mgr,nb);
183           break;
184 
185         case BasicTestsF16::TEST_ADD_F16_2:
186           nb = 16;
187           ref.reload(BasicTestsF16::REF_ADD_F16_ID,mgr,nb);
188           break;
189         case BasicTestsF16::TEST_ADD_F16_3:
190           nb = 23;
191           ref.reload(BasicTestsF16::REF_ADD_F16_ID,mgr,nb);
192           break;
193 
194 
195         case BasicTestsF16::TEST_SUB_F16_4:
196           nb = 7;
197           ref.reload(BasicTestsF16::REF_SUB_F16_ID,mgr,nb);
198           break;
199         case BasicTestsF16::TEST_SUB_F16_5:
200           nb = 16;
201           ref.reload(BasicTestsF16::REF_SUB_F16_ID,mgr,nb);
202           break;
203         case BasicTestsF16::TEST_SUB_F16_6:
204           nb = 23;
205           ref.reload(BasicTestsF16::REF_SUB_F16_ID,mgr,nb);
206           break;
207 
208         case BasicTestsF16::TEST_MULT_F16_7:
209           nb = 7;
210           ref.reload(BasicTestsF16::REF_MULT_F16_ID,mgr,nb);
211           break;
212         case BasicTestsF16::TEST_MULT_F16_8:
213           nb = 16;
214           ref.reload(BasicTestsF16::REF_MULT_F16_ID,mgr,nb);
215           break;
216         case BasicTestsF16::TEST_MULT_F16_9:
217           nb = 23;
218           ref.reload(BasicTestsF16::REF_MULT_F16_ID,mgr,nb);
219           break;
220 
221         case BasicTestsF16::TEST_NEGATE_F16_10:
222           nb = 7;
223           ref.reload(BasicTestsF16::REF_NEGATE_F16_ID,mgr,nb);
224           break;
225         case BasicTestsF16::TEST_NEGATE_F16_11:
226           nb = 16;
227           ref.reload(BasicTestsF16::REF_NEGATE_F16_ID,mgr,nb);
228           break;
229         case BasicTestsF16::TEST_NEGATE_F16_12:
230           nb = 23;
231           ref.reload(BasicTestsF16::REF_NEGATE_F16_ID,mgr,nb);
232           break;
233 
234         case BasicTestsF16::TEST_OFFSET_F16_13:
235           nb = 7;
236           ref.reload(BasicTestsF16::REF_OFFSET_F16_ID,mgr,nb);
237           break;
238         case BasicTestsF16::TEST_OFFSET_F16_14:
239           nb = 16;
240           ref.reload(BasicTestsF16::REF_OFFSET_F16_ID,mgr,nb);
241           break;
242         case BasicTestsF16::TEST_OFFSET_F16_15:
243           nb = 23;
244           ref.reload(BasicTestsF16::REF_OFFSET_F16_ID,mgr,nb);
245           break;
246 
247         case BasicTestsF16::TEST_SCALE_F16_16:
248           nb = 7;
249           ref.reload(BasicTestsF16::REF_SCALE_F16_ID,mgr,nb);
250           break;
251         case BasicTestsF16::TEST_SCALE_F16_17:
252           nb = 16;
253           ref.reload(BasicTestsF16::REF_SCALE_F16_ID,mgr,nb);
254           break;
255         case BasicTestsF16::TEST_SCALE_F16_18:
256           nb = 23;
257           ref.reload(BasicTestsF16::REF_SCALE_F16_ID,mgr,nb);
258           break;
259 
260         case BasicTestsF16::TEST_DOT_PROD_F16_19:
261           nb = 7;
262           ref.reload(BasicTestsF16::REF_DOT_3_F16_ID,mgr);
263           break;
264         case BasicTestsF16::TEST_DOT_PROD_F16_20:
265           nb = 16;
266           ref.reload(BasicTestsF16::REF_DOT_4N_F16_ID,mgr);
267           break;
268         case BasicTestsF16::TEST_DOT_PROD_F16_21:
269           nb = 23;
270           ref.reload(BasicTestsF16::REF_DOT_4N1_F16_ID,mgr);
271           break;
272 
273         case BasicTestsF16::TEST_ABS_F16_22:
274           nb = 7;
275           ref.reload(BasicTestsF16::REF_ABS_F16_ID,mgr,nb);
276           break;
277         case BasicTestsF16::TEST_ABS_F16_23:
278           nb = 16;
279           ref.reload(BasicTestsF16::REF_ABS_F16_ID,mgr,nb);
280           break;
281         case BasicTestsF16::TEST_ABS_F16_24:
282           nb = 23;
283           ref.reload(BasicTestsF16::REF_ABS_F16_ID,mgr,nb);
284           break;
285 
286         case BasicTestsF16::TEST_ADD_F16_25:
287           ref.reload(BasicTestsF16::REF_ADD_F16_ID,mgr,nb);
288         break;
289 
290         case BasicTestsF16::TEST_SUB_F16_26:
291           ref.reload(BasicTestsF16::REF_SUB_F16_ID,mgr,nb);
292         break;
293 
294         case BasicTestsF16::TEST_MULT_F16_27:
295           ref.reload(BasicTestsF16::REF_MULT_F16_ID,mgr,nb);
296         break;
297 
298         case BasicTestsF16::TEST_NEGATE_F16_28:
299           ref.reload(BasicTestsF16::REF_NEGATE_F16_ID,mgr,nb);
300         break;
301 
302         case BasicTestsF16::TEST_OFFSET_F16_29:
303           ref.reload(BasicTestsF16::REF_OFFSET_F16_ID,mgr,nb);
304         break;
305 
306         case BasicTestsF16::TEST_SCALE_F16_30:
307           ref.reload(BasicTestsF16::REF_SCALE_F16_ID,mgr,nb);
308         break;
309 
310         case BasicTestsF16::TEST_DOT_PROD_F16_31:
311           ref.reload(BasicTestsF16::REF_DOT_LONG_F16_ID,mgr);
312         break;
313 
314         case BasicTestsF16::TEST_ABS_F16_32:
315           ref.reload(BasicTestsF16::REF_ABS_F16_ID,mgr,nb);
316         break;
317 
318         case BasicTestsF16::TEST_CLIP_F16_33:
319           ref.reload(BasicTestsF16::REF_CLIP1_F16_ID,mgr);
320           input1.reload(BasicTestsF16::INPUT_CLIP_F16_ID,mgr,ref.nbSamples());
321 
322           // Must be coherent with Python script used to generate test patterns
323           this->min=(float16_t)(-0.5f);
324           this->max=(float16_t)(-0.1f);
325         break;
326 
327         case BasicTestsF16::TEST_CLIP_F16_34:
328           ref.reload(BasicTestsF16::REF_CLIP2_F16_ID,mgr);
329           input1.reload(BasicTestsF16::INPUT_CLIP_F16_ID,mgr,ref.nbSamples());
330 
331           // Must be coherent with Python script used to generate test patterns
332           this->min=(float16_t)(-0.5f);
333           this->max=(float16_t)(0.5f);
334         break;
335 
336         case BasicTestsF16::TEST_CLIP_F16_35:
337           ref.reload(BasicTestsF16::REF_CLIP3_F16_ID,mgr);
338           input1.reload(BasicTestsF16::INPUT_CLIP_F16_ID,mgr,ref.nbSamples());
339 
340           // Must be coherent with Python script used to generate test patterns
341           this->min=(float16_t)(0.1f);
342           this->max=(float16_t)(0.5f);
343         break;
344 
345        }
346 
347        if (id < TEST_CLIP_F16_33)
348        {
349          input1.reload(BasicTestsF16::INPUT1_F16_ID,mgr,nb);
350          input2.reload(BasicTestsF16::INPUT2_F16_ID,mgr,nb);
351        }
352 
353        output.create(ref.nbSamples(),BasicTestsF16::OUT_SAMPLES_F16_ID,mgr);
354     }
355 
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)356     void BasicTestsF16::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
357     {
358         (void)id;
359         output.dump(mgr);
360     }
361