1 #include "BinaryTestsQ31.h"
2 #include <stdio.h>
3 #include "Error.h"
4 
5 #define SNR_THRESHOLD 100
6 
7 /*
8 
9 Reference patterns are generated with
10 a double precision computation.
11 
12 */
13 #define ABS_ERROR_Q31 ((q31_t)5)
14 #define ABS_ERROR_Q63 ((q63_t)(1<<16))
15 
16 #define ONEHALF 0x40000000
17 
18 /* Upper bound of maximum matrix dimension used by Python */
19 #define MAXMATRIXDIM 40
20 
checkInnerTail(q31_t * b)21 static void checkInnerTail(q31_t *b)
22 {
23     ASSERT_TRUE(b[0] == 0);
24     ASSERT_TRUE(b[1] == 0);
25     ASSERT_TRUE(b[2] == 0);
26     ASSERT_TRUE(b[3] == 0);
27 }
28 
29 
30 #define LOADDATA2()                          \
31       const q31_t *inp1=input1.ptr();    \
32       const q31_t *inp2=input2.ptr();    \
33                                              \
34       q31_t *ap=a.ptr();                 \
35       q31_t *bp=b.ptr();                 \
36                                              \
37       q31_t *outp=output.ptr();          \
38       int16_t *dimsp = dims.ptr();           \
39       int nbMatrixes = dims.nbSamples() / 3;\
40       int rows,internal,columns;                      \
41       int i;
42 
43 
44 #define PREPAREDATA2()                                                   \
45       in1.numRows=rows;                                                  \
46       in1.numCols=internal;                                               \
47       memcpy((void*)ap,(const void*)inp1,2*sizeof(q31_t)*rows*internal);\
48       in1.pData = ap;                                                    \
49                                                                          \
50       in2.numRows=internal;                                                  \
51       in2.numCols=columns;                                               \
52       memcpy((void*)bp,(const void*)inp2,2*sizeof(q31_t)*internal*columns);\
53       in2.pData = bp;                                                    \
54                                                                          \
55       out.numRows=rows;                                                  \
56       out.numCols=columns;                                               \
57       out.pData = outp;
58 
59 
60 
61 
test_mat_mult_q31()62     void BinaryTestsQ31::test_mat_mult_q31()
63     {
64       LOADDATA2();
65       arm_status status;
66 
67       for(i=0;i < nbMatrixes ; i ++)
68       {
69           rows = *dimsp++;
70           internal = *dimsp++;
71           columns = *dimsp++;
72 
73           PREPAREDATA2();
74 
75           status=arm_mat_mult_q31(&this->in1,&this->in2,&this->out);
76           ASSERT_TRUE(status==ARM_MATH_SUCCESS);
77 
78           outp += (rows * columns);
79           checkInnerTail(outp);
80 
81       }
82 
83       ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
84 
85       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
86 
87     }
88 
89 
90 
test_mat_cmplx_mult_q31()91     void BinaryTestsQ31::test_mat_cmplx_mult_q31()
92     {
93       LOADDATA2();
94       arm_status status;
95 
96       for(i=0;i < nbMatrixes ; i ++)
97       {
98           rows = *dimsp++;
99           internal = *dimsp++;
100           columns = *dimsp++;
101 
102           PREPAREDATA2();
103 
104           status=arm_mat_cmplx_mult_q31(&this->in1,&this->in2,&this->out);
105           ASSERT_TRUE(status==ARM_MATH_SUCCESS);
106 
107           outp += (2*rows * columns);
108           checkInnerTail(outp);
109       }
110 
111       ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
112 
113       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
114 
115     }
116 
test_mat_mult_opt_q31()117     void BinaryTestsQ31::test_mat_mult_opt_q31()
118     {
119       LOADDATA2();
120       q31_t *tmpPtr=tmp.ptr();
121 
122       arm_status status;
123 
124       for(i=0;i < nbMatrixes ; i ++)
125       {
126           rows = *dimsp++;
127           internal = *dimsp++;
128           columns = *dimsp++;
129 
130           PREPAREDATA2();
131           memset(tmpPtr,0,sizeof(q31_t)*internal*columns + 16);
132           status=arm_mat_mult_opt_q31(&this->in1,&this->in2,&this->out,tmpPtr);
133           ASSERT_TRUE(status==ARM_MATH_SUCCESS);
134 
135           outp += (rows * columns);
136           checkInnerTail(outp);
137           checkInnerTail(tmpPtr + internal*columns);
138 
139       }
140 
141       ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
142 
143       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
144 
145     }
146 
147 
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)148     void BinaryTestsQ31::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
149     {
150 
151 
152       (void)params;
153       switch(id)
154       {
155          case TEST_MAT_MULT_Q31_1:
156             input1.reload(BinaryTestsQ31::INPUTS1_Q31_ID,mgr);
157             input2.reload(BinaryTestsQ31::INPUTS2_Q31_ID,mgr);
158             dims.reload(BinaryTestsQ31::DIMSBINARY1_S16_ID,mgr);
159 
160             ref.reload(BinaryTestsQ31::REFMUL1_Q31_ID,mgr);
161 
162             output.create(ref.nbSamples(),BinaryTestsQ31::OUT_Q31_ID,mgr);
163             a.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPA_Q31_ID,mgr);
164             b.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPB_Q31_ID,mgr);
165          break;
166 
167          case TEST_MAT_CMPLX_MULT_Q31_2:
168             input1.reload(BinaryTestsQ31::INPUTSC1_Q31_ID,mgr);
169             input2.reload(BinaryTestsQ31::INPUTSC2_Q31_ID,mgr);
170             dims.reload(BinaryTestsQ31::DIMSBINARY1_S16_ID,mgr);
171 
172             ref.reload(BinaryTestsQ31::REFCMPLXMUL1_Q31_ID,mgr);
173 
174             output.create(ref.nbSamples(),BinaryTestsQ31::OUT_Q31_ID,mgr);
175             a.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPA_Q31_ID,mgr);
176             b.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPB_Q31_ID,mgr);
177          break;
178 
179          case TEST_MAT_MULT_OPT_Q31_3:
180             input1.reload(BinaryTestsQ31::INPUTS1_Q31_ID,mgr);
181             input2.reload(BinaryTestsQ31::INPUTS2_Q31_ID,mgr);
182             dims.reload(BinaryTestsQ31::DIMSBINARY1_S16_ID,mgr);
183 
184             ref.reload(BinaryTestsQ31::REFMUL1_Q31_ID,mgr);
185 
186             output.create(ref.nbSamples(),BinaryTestsQ31::OUT_Q31_ID,mgr);
187             a.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPA_Q31_ID,mgr);
188             b.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPB_Q31_ID,mgr);
189 
190             tmp.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPC_Q31_ID,mgr);
191 
192          break;
193 
194 
195 
196 
197       }
198 
199 
200 
201     }
202 
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)203     void BinaryTestsQ31::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
204     {
205        (void)id;
206        output.dump(mgr);
207     }
208