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