mirror of
https://github.com/xiph/opus.git
synced 2025-05-15 16:08:30 +00:00

Depending on what defines are set there is collisions with the ones in Opus. To avoid these errors we rename the exp functions and macros. Signed-off-by: Jean-Marc Valin <jmvalin@amazon.com>
130 lines
2.7 KiB
C
130 lines
2.7 KiB
C
#include <stdio.h>
|
|
#include <math.h>
|
|
#include "opus_types.h"
|
|
#include "arch.h"
|
|
#include "common.h"
|
|
#include "tansig_table.h"
|
|
|
|
#define LPCNET_TEST
|
|
|
|
// we need to call two versions of each functions that have the same
|
|
// name, so use #defines to temp rename them
|
|
|
|
#define lpcnet_exp2 lpcnet_exp2_fast
|
|
#define tansig_approx tansig_approx_fast
|
|
#define sigmoid_approx sigmoid_approx_fast
|
|
#define softmax softmax_fast
|
|
#define vec_tanh vec_tanh_fast
|
|
#define vec_sigmoid vec_sigmoid_fast
|
|
#define sgemv_accum16 sgemv_accum16_fast
|
|
#define sparse_sgemv_accum16 sparse_sgemv_accum16_fast
|
|
|
|
#ifdef __AVX__
|
|
#include "vec_avx.h"
|
|
#ifdef __AVX2__
|
|
const char simd[]="AVX2";
|
|
#else
|
|
const char simd[]="AVX";
|
|
#endif
|
|
#elif __ARM_NEON__
|
|
#include "vec_neon.h"
|
|
const char simd[]="NEON";
|
|
#else
|
|
const char simd[]="none";
|
|
|
|
#endif
|
|
|
|
#undef lpcnet_exp2
|
|
#undef tansig_approx
|
|
#undef sigmoid_approx
|
|
#undef softmax
|
|
#undef vec_tanh
|
|
#undef vec_sigmoid
|
|
#undef sgemv_accum16
|
|
#undef sparse_sgemv_accum16
|
|
#include "vec.h"
|
|
|
|
#define ROW_STEP 16
|
|
#define ROWS ROW_STEP*10
|
|
#define COLS 2
|
|
#define ENTRIES 2
|
|
|
|
int test_sgemv_accum16() {
|
|
float weights[ROWS*COLS];
|
|
float x[COLS];
|
|
float out[ROWS], out_fast[ROWS];
|
|
int i;
|
|
|
|
printf("sgemv_accum16.....................: ");
|
|
for(i=0; i<ROWS*COLS; i++) {
|
|
weights[i] = i;
|
|
}
|
|
for(i=0; i<ROWS; i++) {
|
|
out[i] = 0;
|
|
out_fast[i] = 0;
|
|
}
|
|
|
|
for(i=0; i<COLS; i++) {
|
|
x[i] = i+1;
|
|
}
|
|
|
|
sgemv_accum16(out, weights, ROWS, COLS, 1, x);
|
|
sgemv_accum16_fast(out_fast, weights, ROWS, COLS, 1, x);
|
|
|
|
for(i=0; i<ROWS; i++) {
|
|
if (out[i] != out_fast[i]) {
|
|
printf("fail\n");
|
|
for(i=0; i<ROWS; i++) {
|
|
printf("%d %f %f\n", i, out[i], out_fast[i]);
|
|
if (out[i] != out_fast[i])
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
printf("pass\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
int test_sparse_sgemv_accum16() {
|
|
int rows = ROW_STEP*ENTRIES;
|
|
int indx[] = {1,0,2,0,1};
|
|
float w[ROW_STEP*(1+2)];
|
|
float x[ENTRIES] = {1,2};
|
|
float out[ROW_STEP*(1+2)], out_fast[ROW_STEP*(1+2)];
|
|
int i;
|
|
|
|
printf("sparse_sgemv_accum16..............: ");
|
|
for(i=0; i<ROW_STEP*(1+2); i++) {
|
|
w[i] = i;
|
|
out[i] = 0;
|
|
out_fast[i] = 0;
|
|
}
|
|
|
|
sparse_sgemv_accum16(out, w, rows, indx, x);
|
|
sparse_sgemv_accum16_fast(out_fast, w, rows, indx, x);
|
|
|
|
for(i=0; i<ROW_STEP*ENTRIES; i++) {
|
|
if (out[i] != out_fast[i]) {
|
|
printf("fail\n");
|
|
for(i=0; i<ROW_STEP*ENTRIES; i++) {
|
|
printf("%d %f %f\n", i, out[i], out_fast[i]);
|
|
if (out[i] != out_fast[i])
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
printf("pass\n");
|
|
return 0;
|
|
}
|
|
|
|
int main() {
|
|
printf("testing vector routines on SIMD: %s\n", simd);
|
|
int test1 = test_sgemv_accum16();
|
|
int test2 = test_sparse_sgemv_accum16();
|
|
return test1 || test2;
|
|
}
|
|
|
|
|