UnaryTestsF32.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #include "UnaryTestsF32.h"
  2. #include "Error.h"
  3. #define SNR_THRESHOLD 120
  4. /*
  5. Reference patterns are generated with
  6. a double precision computation.
  7. */
  8. #define REL_ERROR (1.0e-6)
  9. #define ABS_ERROR (1.0e-5)
  10. /*
  11. Comparisons for inverse
  12. */
  13. /* Not very accurate for big matrix.
  14. But big matrix needed for checking the vectorized code */
  15. #define SNR_THRESHOLD_INV 70
  16. #define REL_ERROR_INV (1.0e-3)
  17. #define ABS_ERROR_INV (1.0e-3)
  18. /* Upper bound of maximum matrix dimension used by Python */
  19. #define MAXMATRIXDIM 40
  20. #define LOADDATA2() \
  21. const float32_t *inp1=input1.ptr(); \
  22. const float32_t *inp2=input2.ptr(); \
  23. \
  24. float32_t *ap=a.ptr(); \
  25. float32_t *bp=b.ptr(); \
  26. \
  27. float32_t *outp=output.ptr(); \
  28. int16_t *dimsp = dims.ptr(); \
  29. int nbMatrixes = dims.nbSamples() >> 1;\
  30. int rows,columns; \
  31. int i;
  32. #define LOADDATA1() \
  33. const float32_t *inp1=input1.ptr(); \
  34. \
  35. float32_t *ap=a.ptr(); \
  36. \
  37. float32_t *outp=output.ptr(); \
  38. int16_t *dimsp = dims.ptr(); \
  39. int nbMatrixes = dims.nbSamples() >> 1;\
  40. int rows,columns; \
  41. int i;
  42. #define PREPAREDATA2() \
  43. in1.numRows=rows; \
  44. in1.numCols=columns; \
  45. memcpy((void*)ap,(const void*)inp1,sizeof(float32_t)*rows*columns);\
  46. in1.pData = ap; \
  47. \
  48. in2.numRows=rows; \
  49. in2.numCols=columns; \
  50. memcpy((void*)bp,(const void*)inp2,sizeof(float32_t)*rows*columns);\
  51. in2.pData = bp; \
  52. \
  53. out.numRows=rows; \
  54. out.numCols=columns; \
  55. out.pData = outp;
  56. #define PREPAREDATA1(TRANSPOSED) \
  57. in1.numRows=rows; \
  58. in1.numCols=columns; \
  59. memcpy((void*)ap,(const void*)inp1,sizeof(float32_t)*rows*columns);\
  60. in1.pData = ap; \
  61. \
  62. if (TRANSPOSED) \
  63. { \
  64. out.numRows=columns; \
  65. out.numCols=rows; \
  66. } \
  67. else \
  68. { \
  69. out.numRows=rows; \
  70. out.numCols=columns; \
  71. } \
  72. out.pData = outp;
  73. void UnaryTestsF32::test_mat_add_f32()
  74. {
  75. LOADDATA2();
  76. for(i=0;i < nbMatrixes ; i ++)
  77. {
  78. rows = *dimsp++;
  79. columns = *dimsp++;
  80. PREPAREDATA2();
  81. arm_mat_add_f32(&this->in1,&this->in2,&this->out);
  82. outp += (rows * columns);
  83. }
  84. ASSERT_EMPTY_TAIL(output);
  85. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  86. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  87. }
  88. void UnaryTestsF32::test_mat_sub_f32()
  89. {
  90. LOADDATA2();
  91. for(i=0;i < nbMatrixes ; i ++)
  92. {
  93. rows = *dimsp++;
  94. columns = *dimsp++;
  95. PREPAREDATA2();
  96. arm_mat_sub_f32(&this->in1,&this->in2,&this->out);
  97. outp += (rows * columns);
  98. }
  99. ASSERT_EMPTY_TAIL(output);
  100. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  101. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  102. }
  103. void UnaryTestsF32::test_mat_scale_f32()
  104. {
  105. LOADDATA1();
  106. for(i=0;i < nbMatrixes ; i ++)
  107. {
  108. rows = *dimsp++;
  109. columns = *dimsp++;
  110. PREPAREDATA1(false);
  111. arm_mat_scale_f32(&this->in1,0.5f,&this->out);
  112. outp += (rows * columns);
  113. }
  114. ASSERT_EMPTY_TAIL(output);
  115. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  116. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  117. }
  118. void UnaryTestsF32::test_mat_trans_f32()
  119. {
  120. LOADDATA1();
  121. for(i=0;i < nbMatrixes ; i ++)
  122. {
  123. rows = *dimsp++;
  124. columns = *dimsp++;
  125. PREPAREDATA1(true);
  126. arm_mat_trans_f32(&this->in1,&this->out);
  127. outp += (rows * columns);
  128. }
  129. ASSERT_EMPTY_TAIL(output);
  130. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  131. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  132. }
  133. void UnaryTestsF32::test_mat_inverse_f32()
  134. {
  135. const float32_t *inp1=input1.ptr();
  136. float32_t *ap=a.ptr();
  137. float32_t *outp=output.ptr();
  138. int16_t *dimsp = dims.ptr();
  139. int nbMatrixes = dims.nbSamples();
  140. int rows,columns;
  141. int i;
  142. arm_status status;
  143. for(i=0;i < nbMatrixes ; i ++)
  144. {
  145. rows = *dimsp++;
  146. columns = rows;
  147. PREPAREDATA1(false);
  148. status=arm_mat_inverse_f32(&this->in1,&this->out);
  149. //ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  150. outp += (rows * columns);
  151. inp1 += (rows * columns);
  152. }
  153. ASSERT_EMPTY_TAIL(output);
  154. //ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD_INV);
  155. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR_INV,REL_ERROR_INV);
  156. }
  157. void UnaryTestsF32::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  158. {
  159. switch(id)
  160. {
  161. case TEST_MAT_ADD_F32_1:
  162. input1.reload(UnaryTestsF32::INPUTS1_F32_ID,mgr);
  163. input2.reload(UnaryTestsF32::INPUTS2_F32_ID,mgr);
  164. dims.reload(UnaryTestsF32::DIMSUNARY1_S16_ID,mgr);
  165. ref.reload(UnaryTestsF32::REFADD1_F32_ID,mgr);
  166. output.create(ref.nbSamples(),UnaryTestsF32::OUT_F32_ID,mgr);
  167. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF32::TMPA_F32_ID,mgr);
  168. b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF32::TMPB_F32_ID,mgr);
  169. break;
  170. case TEST_MAT_SUB_F32_2:
  171. input1.reload(UnaryTestsF32::INPUTS1_F32_ID,mgr);
  172. input2.reload(UnaryTestsF32::INPUTS2_F32_ID,mgr);
  173. dims.reload(UnaryTestsF32::DIMSUNARY1_S16_ID,mgr);
  174. ref.reload(UnaryTestsF32::REFSUB1_F32_ID,mgr);
  175. output.create(ref.nbSamples(),UnaryTestsF32::OUT_F32_ID,mgr);
  176. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF32::TMPA_F32_ID,mgr);
  177. b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF32::TMPB_F32_ID,mgr);
  178. break;
  179. case TEST_MAT_SCALE_F32_3:
  180. input1.reload(UnaryTestsF32::INPUTS1_F32_ID,mgr);
  181. dims.reload(UnaryTestsF32::DIMSUNARY1_S16_ID,mgr);
  182. ref.reload(UnaryTestsF32::REFSCALE1_F32_ID,mgr);
  183. output.create(ref.nbSamples(),UnaryTestsF32::OUT_F32_ID,mgr);
  184. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF32::TMPA_F32_ID,mgr);
  185. break;
  186. case TEST_MAT_TRANS_F32_4:
  187. input1.reload(UnaryTestsF32::INPUTS1_F32_ID,mgr);
  188. dims.reload(UnaryTestsF32::DIMSUNARY1_S16_ID,mgr);
  189. ref.reload(UnaryTestsF32::REFTRANS1_F32_ID,mgr);
  190. output.create(ref.nbSamples(),UnaryTestsF32::OUT_F32_ID,mgr);
  191. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF32::TMPA_F32_ID,mgr);
  192. break;
  193. case TEST_MAT_INVERSE_F32_5:
  194. input1.reload(UnaryTestsF32::INPUTSINV_F32_ID,mgr);
  195. dims.reload(UnaryTestsF32::DIMSINVERT1_S16_ID,mgr);
  196. ref.reload(UnaryTestsF32::REFINV1_F32_ID,mgr);
  197. output.create(ref.nbSamples(),UnaryTestsF32::OUT_F32_ID,mgr);
  198. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF32::TMPA_F32_ID,mgr);
  199. break;
  200. }
  201. }
  202. void UnaryTestsF32::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  203. {
  204. output.dump(mgr);
  205. }