From eb76eebf177b170ff1fa139318fa9e139d8a6e50 Mon Sep 17 00:00:00 2001 From: Florian Ballenegger Date: Wed, 29 Jul 2020 23:15:44 +0200 Subject: [PATCH] use libmvec only if AVX is available --- configure.ac | 3 +- .../devices/bsim3v32simd/b3v32ldsimd4d.c | 3 +- .../devices/bsim3v32simd/b3v32ldsimd8d.c | 46 +++++++++++++++---- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/configure.ac b/configure.ac index 7d6a68b70..b1a4bfe1e 100644 --- a/configure.ac +++ b/configure.ac @@ -1226,10 +1226,11 @@ if test "x$enable_modsimd" = xyes; then AC_MSG_RESULT([no]) have_intrinsics=no ]) + have_libmvec=no fi # test if we can use libmvec or equivalent -if test "x$enable_modsimd" = xyes; then +if test "x$have_intrinsics" = xyes; then AC_MSG_CHECKING([vector math library]) AC_TRY_COMPILE([ #include diff --git a/src/spicelib/devices/bsim3v32simd/b3v32ldsimd4d.c b/src/spicelib/devices/bsim3v32simd/b3v32ldsimd4d.c index 44325f110..13b340aca 100644 --- a/src/spicelib/devices/bsim3v32simd/b3v32ldsimd4d.c +++ b/src/spicelib/devices/bsim3v32simd/b3v32ldsimd4d.c @@ -329,7 +329,7 @@ static inline int vec4_SIMDCOUNT(Vec4m mask) { } - +#if 0 /* some debug utils functions */ void vec4_printd(const char* msg, const char* name, Vec4d vecd) { @@ -352,3 +352,4 @@ void vec4_CheckCollisions(Vec4m stateindexes, const char* msg) raise(SIGINT); } } +#endif diff --git a/src/spicelib/devices/bsim3v32simd/b3v32ldsimd8d.c b/src/spicelib/devices/bsim3v32simd/b3v32ldsimd8d.c index 4c8fec468..f0f706907 100644 --- a/src/spicelib/devices/bsim3v32simd/b3v32ldsimd8d.c +++ b/src/spicelib/devices/bsim3v32simd/b3v32ldsimd8d.c @@ -28,10 +28,18 @@ * POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ +/* disable omp simd for GCC, as it slow down a bit */ +#if !defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) +#define USE_OMPSIMD +#endif + + static inline Vec8d vec8_blend(Vec8d fa, Vec8d tr, Vec8m mask) { Vec8d r; - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int i=0;i<8;i++) r[i] = (mask[i]==0 ? fa[i] : tr[i]); return r; @@ -40,7 +48,9 @@ static inline Vec8d vec8_blend(Vec8d fa, Vec8d tr, Vec8m mask) static inline Vec8d vec8_exp(Vec8d x) { Vec8d r; - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int i=0;i<8;i++) r[i] = exp(x[i]); return r; @@ -49,7 +59,9 @@ static inline Vec8d vec8_exp(Vec8d x) static inline Vec8d vec8_log(Vec8d x) { Vec8d r; - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int i=0;i<8;i++) r[i] = log(x[i]); return r; @@ -58,7 +70,9 @@ static inline Vec8d vec8_log(Vec8d x) static inline Vec8d vec8_max(Vec8d x, Vec8d y) { Vec8d r; - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int i=0;i<8;i++) r[i] = MAX(x[i],y[i]); return r; @@ -67,7 +81,9 @@ static inline Vec8d vec8_max(Vec8d x, Vec8d y) static inline Vec8d vec8_sqrt(Vec8d x) { Vec8d r; - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int i=0;i<8;i++) r[i] = sqrt(x[i]); return r; @@ -76,7 +92,9 @@ static inline Vec8d vec8_sqrt(Vec8d x) static inline Vec8d vec8_fabs(Vec8d x) { Vec8d r; - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int i=0;i<8;i++) r[i] = fabs(x[i]); return r; @@ -111,7 +129,9 @@ static inline Vec8d vec8_SIMDLOADDATA(int idx, double data[7][8]) static inline Vec8d vec8_BSIM3v32_StateAccess(double* cktstate, Vec8m stateindexes) { Vec8d r; - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int i=0;i<8;i++) r[i] = cktstate[stateindexes[i]]; return r; @@ -120,7 +140,9 @@ static inline Vec8d vec8_BSIM3v32_StateAccess(double* cktstate, Vec8m stateindex static inline void vec8_BSIM3v32_StateStore(double* cktstate, Vec8m stateindexes, Vec8d values) { - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int idx=0;idx<8;idx++) { cktstate[stateindexes[idx]] = values[idx]; @@ -129,7 +151,9 @@ static inline void vec8_BSIM3v32_StateStore(double* cktstate, Vec8m stateindexes static inline void vec8_BSIM3v32_StateAdd(double* cktstate, Vec8m stateindexes, Vec8d values) { - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int idx=0;idx<8;idx++) { cktstate[stateindexes[idx]] += values[idx]; @@ -138,7 +162,9 @@ static inline void vec8_BSIM3v32_StateAdd(double* cktstate, Vec8m stateindexes, static inline void vec8_BSIM3v32_StateSub(double* cktstate, Vec8m stateindexes, Vec8d values) { - #pragma omp simd + #ifdef USE_OMPSIMD + #pragma omp simd simdlen(4) + #endif for(int idx=0;idx<8;idx++) { cktstate[stateindexes[idx]] -= values[idx];