1*a58d3d2aSXin Li #include <stdio.h>
2*a58d3d2aSXin Li #include <math.h>
3*a58d3d2aSXin Li #include "opus_types.h"
4*a58d3d2aSXin Li #include "arch.h"
5*a58d3d2aSXin Li #include "common.h"
6*a58d3d2aSXin Li #include "tansig_table.h"
7*a58d3d2aSXin Li
8*a58d3d2aSXin Li #define LPCNET_TEST
9*a58d3d2aSXin Li
10*a58d3d2aSXin Li // we need to call two versions of each functions that have the same
11*a58d3d2aSXin Li // name, so use #defines to temp rename them
12*a58d3d2aSXin Li
13*a58d3d2aSXin Li #define lpcnet_exp2 lpcnet_exp2_fast
14*a58d3d2aSXin Li #define tansig_approx tansig_approx_fast
15*a58d3d2aSXin Li #define sigmoid_approx sigmoid_approx_fast
16*a58d3d2aSXin Li #define softmax softmax_fast
17*a58d3d2aSXin Li #define vec_tanh vec_tanh_fast
18*a58d3d2aSXin Li #define vec_sigmoid vec_sigmoid_fast
19*a58d3d2aSXin Li #define sgemv_accum16 sgemv_accum16_fast
20*a58d3d2aSXin Li #define sparse_sgemv_accum16 sparse_sgemv_accum16_fast
21*a58d3d2aSXin Li
22*a58d3d2aSXin Li #ifdef __AVX__
23*a58d3d2aSXin Li #include "vec_avx.h"
24*a58d3d2aSXin Li #ifdef __AVX2__
25*a58d3d2aSXin Li const char simd[]="AVX2";
26*a58d3d2aSXin Li #else
27*a58d3d2aSXin Li const char simd[]="AVX";
28*a58d3d2aSXin Li #endif
29*a58d3d2aSXin Li #elif __ARM_NEON__
30*a58d3d2aSXin Li #include "vec_neon.h"
31*a58d3d2aSXin Li const char simd[]="NEON";
32*a58d3d2aSXin Li #else
33*a58d3d2aSXin Li const char simd[]="none";
34*a58d3d2aSXin Li
35*a58d3d2aSXin Li #endif
36*a58d3d2aSXin Li
37*a58d3d2aSXin Li #undef lpcnet_exp2
38*a58d3d2aSXin Li #undef tansig_approx
39*a58d3d2aSXin Li #undef sigmoid_approx
40*a58d3d2aSXin Li #undef softmax
41*a58d3d2aSXin Li #undef vec_tanh
42*a58d3d2aSXin Li #undef vec_sigmoid
43*a58d3d2aSXin Li #undef sgemv_accum16
44*a58d3d2aSXin Li #undef sparse_sgemv_accum16
45*a58d3d2aSXin Li #include "vec.h"
46*a58d3d2aSXin Li
47*a58d3d2aSXin Li #define ROW_STEP 16
48*a58d3d2aSXin Li #define ROWS ROW_STEP*10
49*a58d3d2aSXin Li #define COLS 2
50*a58d3d2aSXin Li #define ENTRIES 2
51*a58d3d2aSXin Li
test_sgemv_accum16()52*a58d3d2aSXin Li int test_sgemv_accum16() {
53*a58d3d2aSXin Li float weights[ROWS*COLS];
54*a58d3d2aSXin Li float x[COLS];
55*a58d3d2aSXin Li float out[ROWS], out_fast[ROWS];
56*a58d3d2aSXin Li int i;
57*a58d3d2aSXin Li
58*a58d3d2aSXin Li printf("sgemv_accum16.....................: ");
59*a58d3d2aSXin Li for(i=0; i<ROWS*COLS; i++) {
60*a58d3d2aSXin Li weights[i] = i;
61*a58d3d2aSXin Li }
62*a58d3d2aSXin Li for(i=0; i<ROWS; i++) {
63*a58d3d2aSXin Li out[i] = 0;
64*a58d3d2aSXin Li out_fast[i] = 0;
65*a58d3d2aSXin Li }
66*a58d3d2aSXin Li
67*a58d3d2aSXin Li for(i=0; i<COLS; i++) {
68*a58d3d2aSXin Li x[i] = i+1;
69*a58d3d2aSXin Li }
70*a58d3d2aSXin Li
71*a58d3d2aSXin Li sgemv_accum16(out, weights, ROWS, COLS, 1, x);
72*a58d3d2aSXin Li sgemv_accum16_fast(out_fast, weights, ROWS, COLS, 1, x);
73*a58d3d2aSXin Li
74*a58d3d2aSXin Li for(i=0; i<ROWS; i++) {
75*a58d3d2aSXin Li if (out[i] != out_fast[i]) {
76*a58d3d2aSXin Li printf("fail\n");
77*a58d3d2aSXin Li for(i=0; i<ROWS; i++) {
78*a58d3d2aSXin Li printf("%d %f %f\n", i, out[i], out_fast[i]);
79*a58d3d2aSXin Li if (out[i] != out_fast[i])
80*a58d3d2aSXin Li return 1;
81*a58d3d2aSXin Li }
82*a58d3d2aSXin Li }
83*a58d3d2aSXin Li }
84*a58d3d2aSXin Li
85*a58d3d2aSXin Li printf("pass\n");
86*a58d3d2aSXin Li return 0;
87*a58d3d2aSXin Li }
88*a58d3d2aSXin Li
89*a58d3d2aSXin Li
test_sparse_sgemv_accum16()90*a58d3d2aSXin Li int test_sparse_sgemv_accum16() {
91*a58d3d2aSXin Li int rows = ROW_STEP*ENTRIES;
92*a58d3d2aSXin Li int indx[] = {1,0,2,0,1};
93*a58d3d2aSXin Li float w[ROW_STEP*(1+2)];
94*a58d3d2aSXin Li float x[ENTRIES] = {1,2};
95*a58d3d2aSXin Li float out[ROW_STEP*(1+2)], out_fast[ROW_STEP*(1+2)];
96*a58d3d2aSXin Li int i;
97*a58d3d2aSXin Li
98*a58d3d2aSXin Li printf("sparse_sgemv_accum16..............: ");
99*a58d3d2aSXin Li for(i=0; i<ROW_STEP*(1+2); i++) {
100*a58d3d2aSXin Li w[i] = i;
101*a58d3d2aSXin Li out[i] = 0;
102*a58d3d2aSXin Li out_fast[i] = 0;
103*a58d3d2aSXin Li }
104*a58d3d2aSXin Li
105*a58d3d2aSXin Li sparse_sgemv_accum16(out, w, rows, indx, x);
106*a58d3d2aSXin Li sparse_sgemv_accum16_fast(out_fast, w, rows, indx, x);
107*a58d3d2aSXin Li
108*a58d3d2aSXin Li for(i=0; i<ROW_STEP*ENTRIES; i++) {
109*a58d3d2aSXin Li if (out[i] != out_fast[i]) {
110*a58d3d2aSXin Li printf("fail\n");
111*a58d3d2aSXin Li for(i=0; i<ROW_STEP*ENTRIES; i++) {
112*a58d3d2aSXin Li printf("%d %f %f\n", i, out[i], out_fast[i]);
113*a58d3d2aSXin Li if (out[i] != out_fast[i])
114*a58d3d2aSXin Li return 1;
115*a58d3d2aSXin Li }
116*a58d3d2aSXin Li }
117*a58d3d2aSXin Li }
118*a58d3d2aSXin Li
119*a58d3d2aSXin Li printf("pass\n");
120*a58d3d2aSXin Li return 0;
121*a58d3d2aSXin Li }
122*a58d3d2aSXin Li
main()123*a58d3d2aSXin Li int main() {
124*a58d3d2aSXin Li printf("testing vector routines on SIMD: %s\n", simd);
125*a58d3d2aSXin Li int test1 = test_sgemv_accum16();
126*a58d3d2aSXin Li int test2 = test_sparse_sgemv_accum16();
127*a58d3d2aSXin Li return test1 || test2;
128*a58d3d2aSXin Li }
129