xref: /aosp_15_r20/external/libopus/dnn/test_vec.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
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