use libmvec only if AVX is available

This commit is contained in:
Florian Ballenegger 2020-07-29 23:15:44 +02:00
parent 34ebb23b9d
commit eb76eebf17
3 changed files with 40 additions and 12 deletions

View File

@ -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 <math.h>

View File

@ -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

View File

@ -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];