diff --git a/Makefile.am b/Makefile.am index 41023691..effc0bba 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ AUTOMAKE_OPTIONS = color-tests SUBDIRS = src/usolve src/fglm src/neogb src/msolve -AM_CFLAGS = $(SIMD_FLAGS) $(CPUEXT_FLAGS) $(OPENMP_CFLAGS) +AM_CFLAGS = $(OPENMP_CFLAGS) LDADD = src/neogb/libneogb.la src/fglm/libfglm.la src/usolve/libusolve.la bin_PROGRAMS = msolve diff --git a/configure.ac b/configure.ac index 77d47f48..a286335c 100644 --- a/configure.ac +++ b/configure.ac @@ -70,7 +70,48 @@ AC_TYPE_UINT8_T AX_COUNT_CPUS -AX_EXT +# By default, select SIMD code from the compiler target rather than the build CPU. +# Let packagers disable either implementation without changing their CFLAGS. +AC_ARG_ENABLE([avx2], + [AS_HELP_STRING([--enable-avx2], [enable AVX2 code (default: compiler target)])], + [], [enable_avx2=auto]) +AS_CASE([$enable_avx2], [yes|no|auto], [], + [AC_MSG_ERROR([bad value $enable_avx2 for --enable-avx2])]) +AS_IF([test "x$enable_avx2" = xauto], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifndef __AVX2__ +#error AVX2 is not enabled +#endif +]], [[]])], [enable_avx2=yes], [enable_avx2=no]) +]) +AS_IF([test "x$enable_avx2" = xyes], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ + __m256i value = _mm256_set1_epi64x(1); + return _mm256_extract_epi64(value, 0); + ]])], [AC_DEFINE([HAVE_AVX2], [1], [Enable AVX2 code])], + [AC_MSG_ERROR([AVX2 code requires a compiler target supporting AVX2 (for example, -mavx2 in CFLAGS)])]) +]) + +AC_ARG_ENABLE([avx512f], + [AS_HELP_STRING([--enable-avx512f], [enable AVX-512 code (requires AVX-512F and AVX-512BW; default: compiler target)])], + [], [enable_avx512f=auto]) +AS_CASE([$enable_avx512f], [yes|no|auto], [], + [AC_MSG_ERROR([bad value $enable_avx512f for --enable-avx512f])]) +AS_IF([test "x$enable_avx512f" = xauto], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifndef __AVX512F__ +#error AVX512F is not enabled +#endif +]], [[]])], [enable_avx512f=yes], [enable_avx512f=no]) +]) +AS_IF([test "x$enable_avx512f" = xyes], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ + __m512i value = _mm512_set1_epi16(1); + value = _mm512_mullo_epi16(value, value); + return _mm512_cvtsi512_si32(value); + ]])], [AC_DEFINE([HAVE_AVX512_F], [1], [Enable AVX512F code])], + [AC_MSG_ERROR([AVX-512 code requires a compiler target supporting AVX-512F and AVX-512BW (for example, -mavx512f -mavx512bw in CFLAGS)])]) +]) AX_GCC_BUILTIN([__builtin_constant_p]) AX_GCC_BUILTIN([__builtin_clzll]) AX_GCC_BUILTIN([__builtin_clzl]) diff --git a/src/fglm/Makefile.am b/src/fglm/Makefile.am index b5e8767a..346e0447 100644 --- a/src/fglm/Makefile.am +++ b/src/fglm/Makefile.am @@ -2,7 +2,7 @@ noinst_LTLIBRARIES = libfglm.la libfglm_la_SOURCES = fglm_core.c libfglm_ladir = $(includedir)/msolve/fglm libfglm_la_HEADERS = fglm.h -libfglm_la_CFLAGS = $(SIMD_FLAGS) $(CPUEXT_FLAGS) $(OPENMP_CFLAGS) -Wall -Wextra +libfglm_la_CFLAGS = $(OPENMP_CFLAGS) -Wall -Wextra EXTRA_DIST = fglm.h \ libfglm.h \ diff --git a/src/fglm/linalg-fglm.c b/src/fglm/linalg-fglm.c index 01463d2d..482ea1af 100644 --- a/src/fglm/linalg-fglm.c +++ b/src/fglm/linalg-fglm.c @@ -26,7 +26,7 @@ #include #endif -#ifdef HAVE_AVX2 +#if defined(HAVE_AVX2) || defined(HAVE_AVX512_F) #include #endif diff --git a/src/msolve/Makefile.am b/src/msolve/Makefile.am index 1f41ac4e..c44c3ec5 100644 --- a/src/msolve/Makefile.am +++ b/src/msolve/Makefile.am @@ -2,7 +2,7 @@ lib_LTLIBRARIES = libmsolve.la libmsolve_la_SOURCES = libmsolve.c libmsolve_ladir = $(includedir)/msolve/msolve libmsolve_la_HEADERS = msolve-data.h msolve-version.h msolve.h -libmsolve_la_CFLAGS = $(SIMD_FLAGS) $(CPUEXT_FLAGS) $(OPENMP_CFLAGS) -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare +libmsolve_la_CFLAGS = $(OPENMP_CFLAGS) -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare libmsolve_la_LDFLAGS = -version-info $(LT_VERSION) libmsolve_la_LIBADD = ../usolve/libusolve.la ../fglm/libfglm.la ../neogb/libneogb.la diff --git a/src/neogb/Makefile.am b/src/neogb/Makefile.am index f9800338..24b40c4e 100644 --- a/src/neogb/Makefile.am +++ b/src/neogb/Makefile.am @@ -5,7 +5,7 @@ libneogb_la_HEADERS =libneogb.h basis.h data.h engine.h f4.h sba.h hash.h \ io.h modular.h nf.h f4sat.h sort_r.h meta_data.h \ tools.h update.h libneogb_la_LDFLAGS = -version-info $(LT_VERSION) -libneogb_la_CFLAGS = $(SIMD_FLAGS) $(CPUEXT_FLAGS) $(OPENMP_CFLAGS) -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare +libneogb_la_CFLAGS = $(OPENMP_CFLAGS) -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare EXTRA_DIST = basis.h \ data.h \ diff --git a/src/neogb/la_ff_16.c b/src/neogb/la_ff_16.c index 9b08e8df..8582d1ea 100644 --- a/src/neogb/la_ff_16.c +++ b/src/neogb/la_ff_16.c @@ -21,8 +21,7 @@ #include "data.h" #include "../msolve/streams.h" -/* That's also enough if AVX512 is avaialable on the system */ -#if defined HAVE_AVX2 +#if defined(HAVE_AVX2) || defined(HAVE_AVX512_F) #include #elif defined __aarch64__ #include diff --git a/src/neogb/la_ff_32.c b/src/neogb/la_ff_32.c index 52c912b6..7c328dec 100644 --- a/src/neogb/la_ff_32.c +++ b/src/neogb/la_ff_32.c @@ -21,8 +21,7 @@ #include "data.h" #include "../msolve/streams.h" -/* That's also enough if AVX512 is available on the system */ -#if defined HAVE_AVX2 +#if defined(HAVE_AVX2) || defined(HAVE_AVX512_F) #include #elif defined __aarch64__ #include diff --git a/src/neogb/la_ff_8.c b/src/neogb/la_ff_8.c index 89af2c54..be177d30 100644 --- a/src/neogb/la_ff_8.c +++ b/src/neogb/la_ff_8.c @@ -21,8 +21,7 @@ #include "data.h" #include "../msolve/streams.h" -/* That's also enough if AVX512 is avaialable on the system */ -#if defined HAVE_AVX2 +#if defined(HAVE_AVX2) || defined(HAVE_AVX512_F) #include #elif defined __aarch64__ #include diff --git a/src/usolve/Makefile.am b/src/usolve/Makefile.am index 43216bdc..70f63283 100644 --- a/src/usolve/Makefile.am +++ b/src/usolve/Makefile.am @@ -2,7 +2,7 @@ noinst_LTLIBRARIES = libusolve.la libusolve_la_SOURCES = usolve.c libusolve_ladir = $(includedir)/msolve/usolve libusolve_la_HEADERS = libusolve.h -libusolve_la_CFLAGS = $(SIMD_FLAGS) $(CPUEXT_FLAGS) $(OPENMP_CFLAGS) -Wall -Wextra +libusolve_la_CFLAGS = $(OPENMP_CFLAGS) -Wall -Wextra EXTRA_DIST = libusolve.h \ bisection.h \