UnaryTestsF32.cpp 8.9 KB

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