configure can select simd vector length
This commit is contained in:
parent
859fc15812
commit
09d192eed2
139
configure.ac
139
configure.ac
|
|
@ -1184,14 +1184,32 @@ if test "x$enable_openmp" = xyes; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
################# MODSIMD ##################################################
|
################# MODSIMD ##################################################
|
||||||
# --enable-modsimd: define MODSIMD in the code. This use simd acceleration in devices code
|
# --enable-modsimd=N: define MODSIMD in the code with vector length N.
|
||||||
|
# This use simd acceleration in devices code
|
||||||
AC_ARG_ENABLE([modsimd],
|
AC_ARG_ENABLE([modsimd],
|
||||||
[AS_HELP_STRING([--enable-modsimd], [Enable simd acceleration in some device models])])
|
[AS_HELP_STRING([--enable-modsimd[=yes/no/2/4/8]], [Enable simd acceleration in some device models. Value specify the simd vector length ("yes" default to 4).])])
|
||||||
|
|
||||||
# --with-sleef: Use SLEEF vector math library. Default is "no".
|
# --with-sleef: Use SLEEF vector math library. Default is "no".
|
||||||
AC_ARG_WITH([sleef],
|
AC_ARG_WITH([sleef],
|
||||||
[AS_HELP_STRING([--with-sleef[=yes/no]], [Use SLEEF vector math library in SIMD models. Default=no.])])
|
[AS_HELP_STRING([--with-sleef[=yes/no]], [Use SLEEF vector math library in SIMD models. Default=no.])])
|
||||||
|
|
||||||
|
if test "x$enable_modsimd" = xyes; then
|
||||||
|
enable_modsimd=yes
|
||||||
|
nsimd=4
|
||||||
|
fi
|
||||||
|
if test "x$enable_modsimd" = x4; then
|
||||||
|
enable_modsimd=yes
|
||||||
|
nsimd=4
|
||||||
|
fi
|
||||||
|
if test "x$enable_modsimd" = x2; then
|
||||||
|
enable_modsimd=yes
|
||||||
|
nsimd=2
|
||||||
|
fi
|
||||||
|
if test "x$enable_modsimd" = x8; then
|
||||||
|
enable_modsimd=yes
|
||||||
|
nsimd=8
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$enable_modsimd" = xyes; then
|
if test "x$enable_modsimd" = xyes; then
|
||||||
OPENMPSIMD_CFLAGS="-fopenmp-simd"
|
OPENMPSIMD_CFLAGS="-fopenmp-simd"
|
||||||
|
|
||||||
|
|
@ -1214,46 +1232,84 @@ fi
|
||||||
|
|
||||||
# now check if intrinsics can be used
|
# now check if intrinsics can be used
|
||||||
if test "x$enable_modsimd" = xyes; then
|
if test "x$enable_modsimd" = xyes; then
|
||||||
AC_MSG_CHECKING([x86 blend intrinsics])
|
have_intrinsics=no
|
||||||
AC_TRY_COMPILE([
|
|
||||||
#include <x86intrin.h>
|
|
||||||
typedef double Vec4d __attribute__ ((vector_size (4*sizeof(double)), aligned (4*sizeof(double))));
|
|
||||||
],[
|
|
||||||
Vec4d v1,v2;
|
|
||||||
v1 = (Vec4d) {1.0,2.0,3.141592,4.0};
|
|
||||||
v2 = v1 + 10.1;
|
|
||||||
v2 = _mm256_blendv_pd(v1,v2,(Vec4d) (v1>3.0));
|
|
||||||
],[
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
have_intrinsics=yes
|
|
||||||
], [
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
have_intrinsics=no
|
|
||||||
])
|
|
||||||
have_libmvec=no
|
have_libmvec=no
|
||||||
have_sleef=no
|
have_sleef=no
|
||||||
|
if test "x$nsimd" = x2; then
|
||||||
|
AC_MSG_CHECKING([x86 blend intrinsics NSIMD=2])
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM(
|
||||||
|
[[#include <x86intrin.h>
|
||||||
|
typedef double Vec2d __attribute__ ((vector_size (2*sizeof(double))));]],
|
||||||
|
[[Vec2d v1 = (Vec2d) {1,2};
|
||||||
|
v1 = _mm_blendv_pd(v1,v1+1,(Vec2d) (v1>3.0)); ]])],
|
||||||
|
[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
have_intrinsics=yes
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
] )
|
||||||
|
fi
|
||||||
|
if test "x$nsimd" = x4; then
|
||||||
|
AC_MSG_CHECKING([x86 blend intrinsics NSIMD=4])
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM(
|
||||||
|
[[#include <x86intrin.h>
|
||||||
|
typedef double Vec4d __attribute__ ((vector_size (4*sizeof(double))));]],
|
||||||
|
[[Vec4d v1 = (Vec4d) {1,2,1.2,3.3};
|
||||||
|
v1 = _mm256_blendv_pd(v1,v1+1,(Vec4d) (v1>3.0)); ]])],
|
||||||
|
[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
have_intrinsics=yes
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# do we want to use SLEEF ?
|
# do we want to use SLEEF ?
|
||||||
if test "x$enable_modsimd" = xyes; then
|
if test "x$enable_modsimd" = xyes; then
|
||||||
if test "x$with_sleef" = xyes; then
|
if test "x$with_sleef" = xyes; then
|
||||||
AC_CHECK_HEADERS([sleef.h])
|
if test "x$nsimd" = x4; then
|
||||||
AC_CHECK_LIB([sleef], [Sleef_logd4_u35],
|
AC_CHECK_HEADERS([sleef.h])
|
||||||
|
AC_CHECK_LIB([sleef], [Sleef_logd4_u35],
|
||||||
[AC_DEFINE([HAVE_LIBSLEEF], [], [Have SLEEF vector math library])
|
[AC_DEFINE([HAVE_LIBSLEEF], [], [Have SLEEF vector math library])
|
||||||
LIBS="$LIBS -lsleef"
|
LIBS="$LIBS -lsleef"
|
||||||
have_sleef=yes
|
have_sleef=yes
|
||||||
AC_MSG_RESULT([Use SLEEF])
|
AC_MSG_RESULT([Use SLEEF])
|
||||||
], [have_sleef=no]
|
], [have_sleef=no]
|
||||||
)
|
)
|
||||||
|
fi
|
||||||
|
if test "x$nsimd" = x2; then
|
||||||
|
AC_CHECK_HEADERS([sleef.h])
|
||||||
|
AC_CHECK_LIB([sleef], [Sleef_logd2_u35],
|
||||||
|
[AC_DEFINE([HAVE_LIBSLEEF], [], [Have SLEEF vector math library])
|
||||||
|
LIBS="$LIBS -lsleef"
|
||||||
|
have_sleef=yes
|
||||||
|
AC_MSG_RESULT([Use SLEEF])
|
||||||
|
], [have_sleef=no]
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
if test "x$nsimd" = x8; then
|
||||||
|
AC_CHECK_HEADERS([sleef.h])
|
||||||
|
AC_CHECK_LIB([sleef], [Sleef_logd8_u35],
|
||||||
|
[AC_DEFINE([HAVE_LIBSLEEF], [], [Have SLEEF vector math library])
|
||||||
|
LIBS="$LIBS -lsleef"
|
||||||
|
have_sleef=yes
|
||||||
|
AC_MSG_RESULT([Use SLEEF])
|
||||||
|
], [have_sleef=no]
|
||||||
|
)
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# otherwise test if we can use libmvec or equivalent
|
# otherwise test if we can use libmvec or equivalent
|
||||||
if test "x$have_intrinsics" = xyes; then
|
if test "x$have_intrinsics" = xyes; then
|
||||||
if test "x$have_sleef" != xyes; then
|
if test "x$have_sleef" != xyes; then
|
||||||
AC_MSG_CHECKING([vector math library])
|
AC_MSG_CHECKING([vector math library libmvec])
|
||||||
AC_LINK_IFELSE(
|
have_libmvec=no
|
||||||
[
|
if test "x$nsimd" = x4; then
|
||||||
|
AC_LINK_IFELSE([
|
||||||
AC_LANG_PROGRAM(
|
AC_LANG_PROGRAM(
|
||||||
[[
|
[[
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
@ -1265,14 +1321,36 @@ if test "x$have_sleef" != xyes; then
|
||||||
v1 = (Vec4d) {1.0,2.0,3.141592,4.0};
|
v1 = (Vec4d) {1.0,2.0,3.141592,4.0};
|
||||||
v2 = _ZGVdN4v_log(v1);
|
v2 = _ZGVdN4v_log(v1);
|
||||||
v1 = _ZGVdN4v_exp(v2);
|
v1 = _ZGVdN4v_exp(v2);
|
||||||
]])
|
]]) ],[
|
||||||
],[
|
|
||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
have_libmvec=yes
|
have_libmvec=yes
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
have_libmvec=no
|
have_libmvec=no
|
||||||
])
|
])
|
||||||
|
fi
|
||||||
|
if test "x$nsimd" = x2; then
|
||||||
|
AC_LINK_IFELSE([
|
||||||
|
AC_LANG_PROGRAM(
|
||||||
|
[[
|
||||||
|
#include <math.h>
|
||||||
|
typedef double Vec2d __attribute__ ((vector_size (2*sizeof(double)), aligned (2*sizeof(double))));
|
||||||
|
Vec2d _ZGVbN2v_exp(Vec2d x);
|
||||||
|
Vec2d _ZGVbN2v_log(Vec2d x);
|
||||||
|
]],[[
|
||||||
|
Vec2d v1,v2;
|
||||||
|
v1 = (Vec2d) {1.0,2.0};
|
||||||
|
v2 = _ZGVbN2v_exp(v1);
|
||||||
|
v1 = _ZGVbN2v_log(v2);
|
||||||
|
]]) ],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
have_libmvec=yes
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
have_libmvec=no
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -1305,7 +1383,16 @@ fi
|
||||||
if test "x$enable_modsimd" = xyes; then
|
if test "x$enable_modsimd" = xyes; then
|
||||||
AC_DEFINE([BSIM3v32SIMD], [1], [simd acceleration for BSIM3V32 device])
|
AC_DEFINE([BSIM3v32SIMD], [1], [simd acceleration for BSIM3V32 device])
|
||||||
AC_DEFINE([MODSIMD], [1], [simd acceleration for some device models])
|
AC_DEFINE([MODSIMD], [1], [simd acceleration for some device models])
|
||||||
|
if test "x$nsimd" = x4; then
|
||||||
|
AC_DEFINE([NSIMD], [4], [simd vector length])
|
||||||
|
fi
|
||||||
|
if test "x$nsimd" = x2; then
|
||||||
|
AC_DEFINE([NSIMD], [2], [simd vector length])
|
||||||
|
fi
|
||||||
|
if test "x$nsimd" = x8; then
|
||||||
|
AC_DEFINE([NSIMD], [8], [simd vector length])
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$have_intrinsics" = xyes; then
|
if test "x$have_intrinsics" = xyes; then
|
||||||
AC_DEFINE([USEX86INTRINSICS], [1], [can use x86 simd intrinsics])
|
AC_DEFINE([USEX86INTRINSICS], [1], [can use x86 simd intrinsics])
|
||||||
AC_MSG_RESULT([Use x86 simd intrinsics])
|
AC_MSG_RESULT([Use x86 simd intrinsics])
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue