diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 7eec735d8..b1b49220e 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -10,44 +10,48 @@ defaults: jobs: build: runs-on: ubuntu-latest - name: '${{ matrix.sys.compiler }} ${{ matrix.sys.version }} - ${{ matrix.sys.flags }}' + name: '${{ matrix.sys.compiler }} ${{ matrix.sys.version }} - ${{ matrix.sys.preset }} - ${{ matrix.sys.flags }}' strategy: matrix: sys: - - { compiler: 'gcc', version: '12', flags: 'force_no_instr_set' } - - { compiler: 'gcc', version: '13', flags: 'enable_xtl_complex' } - - { compiler: 'gcc', version: '14', flags: 'avx' } - - { compiler: 'gcc', version: '14', flags: 'avx2' } - - { compiler: 'gcc', version: '13', flags: 'avx512' } - - { compiler: 'gcc', version: '10', flags: 'avx512' } - - { compiler: 'gcc', version: '12', flags: 'i386' } - - { compiler: 'gcc', version: '13', flags: 'avx512pf' } - - { compiler: 'gcc', version: '13', flags: 'avx512vbmi' } - - { compiler: 'gcc', version: '14', flags: 'avx512vbmi2' } - - { compiler: 'gcc', version: '13', flags: 'avx512vnni' } - - { compiler: 'clang', version: '16', flags: 'force_no_instr_set' } - - { compiler: 'clang', version: '16', flags: 'enable_xtl_complex' } - - { compiler: 'clang', version: '17', flags: 'avx' } - - { compiler: 'clang', version: '17', flags: 'sse3' } - - { compiler: 'clang', version: '18', flags: 'avx512' } - - { compiler: 'clang', version: '18', flags: 'avx_128' } - - { compiler: 'clang', version: '18', flags: 'avx2_128' } + - { compiler: 'gcc', version: '12', flags: 'force_no_instr_set', preset: 'native' } + - { compiler: 'gcc', version: '13', flags: 'enable_xtl_complex', preset: 'native' } + - { compiler: 'gcc', version: '14', flags: '', preset: 'avx' } + - { compiler: 'gcc', version: '14', flags: '', preset: 'avx2' } + - { compiler: 'gcc', version: '13', flags: '', preset: 'avx512f' } + - { compiler: 'gcc', version: '10', flags: '', preset: 'avx512f' } + - { compiler: 'gcc', version: '12', flags: 'i386', preset: 'native' } + - { compiler: 'gcc', version: '13', flags: '', preset: 'avx512pf' } + - { compiler: 'gcc', version: '13', flags: '', preset: 'avx512vbmi' } + - { compiler: 'gcc', version: '14', flags: '', preset: 'avx512vbmi2' } + - { compiler: 'gcc', version: '13', flags: '', preset: 'avx512vnni_avx512bw' } + - { compiler: 'clang', version: '16', flags: 'force_no_instr_set', preset: 'native' } + - { compiler: 'clang', version: '16', flags: 'enable_xtl_complex', preset: 'native' } + - { compiler: 'clang', version: '17', flags: '', preset: 'avx' } + - { compiler: 'clang', version: '17', flags: '', preset: 'sse3' } + - { compiler: 'clang', version: '18', flags: '', preset: 'avx512f' } + - { compiler: 'clang', version: '18', flags: '', preset: 'avx_128' } + - { compiler: 'clang', version: '18', flags: '', preset: 'avx2_128' } steps: - - name: Setup compiler + - name: Setup GCC compiler if: ${{ matrix.sys.compiler == 'gcc' }} run: | GCC_VERSION=${{ matrix.sys.version }} sudo apt-get update sudo apt-get --no-install-suggests --no-install-recommends install g++-$GCC_VERSION - sudo dpkg --add-architecture i386 - sudo add-apt-repository ppa:ubuntu-toolchain-r/test - sudo apt-get update - sudo apt-get --no-install-suggests --no-install-recommends install gcc-$GCC_VERSION-multilib g++-$GCC_VERSION-multilib linux-libc-dev:i386 - CC=gcc-$GCC_VERSION - echo "CC=$CC" >> $GITHUB_ENV - CXX=g++-$GCC_VERSION - echo "CXX=$CXX" >> $GITHUB_ENV - - name: Setup compiler + # Setup i386 as needed + if [[ '${{ matrix.sys.flags }}' == 'i386' ]]; then + sudo dpkg --add-architecture i386 + sudo add-apt-repository ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get --no-install-suggests --no-install-recommends install \ + gcc-$GCC_VERSION-multilib g++-$GCC_VERSION-multilib linux-libc-dev:i386 + fi + # Export compiler as environment var + echo "CC=gcc-$GCC_VERSION" >> $GITHUB_ENV + echo "CXX=g++-$GCC_VERSION" >> $GITHUB_ENV + + - name: Setup Clang compiler if: ${{ matrix.sys.compiler == 'clang' }} run: | LLVM_VERSION=${{ matrix.sys.version }} @@ -55,19 +59,22 @@ jobs: sudo apt-get --no-install-suggests --no-install-recommends install clang-$LLVM_VERSION || exit 1 sudo apt-get --no-install-suggests --no-install-recommends install g++ g++-multilib || exit 1 sudo ln -s /usr/include/asm-generic /usr/include/asm - CC=clang-$LLVM_VERSION - echo "CC=$CC" >> $GITHUB_ENV - CXX=clang++-$LLVM_VERSION - echo "CXX=$CXX" >> $GITHUB_ENV + # Export compiler as environment var + echo "CC=clang-$LLVM_VERSION" >> $GITHUB_ENV + echo "CXX=clang++-$LLVM_VERSION" >> $GITHUB_ENV + - name: Checkout xsimd uses: actions/checkout@v6 + - name: Install mamba - uses: mamba-org/setup-micromamba@v2 + uses: mamba-org/setup-micromamba@v3 with: environment-file: environment.yml + - name: Setup SDE - if: startswith(matrix.sys.flags, 'avx512') + if: startswith(matrix.sys.preset, 'avx512') run: sh install_sde.sh + - name: Configure build env: CC: ${{ env.CC }} @@ -76,49 +83,18 @@ jobs: if [[ '${{ matrix.sys.flags }}' == 'enable_xtl_complex' ]]; then CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DENABLE_XTL_COMPLEX=ON" fi - if [[ '${{ matrix.sys.flags }}' == 'avx' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=sandybridge" - fi - if [[ '${{ matrix.sys.flags }}' == 'avx_128' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=sandybridge -DXSIMD_DEFAULT_ARCH=avx_128" - fi - if [[ '${{ matrix.sys.flags }}' == 'avx2' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=haswell" - fi - if [[ '${{ matrix.sys.flags }}' == 'avx2_128' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=haswell -DXSIMD_DEFAULT_ARCH=avx2_128" - fi - if [[ '${{ matrix.sys.flags }}' == 'sse3' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=nocona" - fi - if [[ '${{ matrix.sys.flags }}' == 'avx512' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=skylake-avx512" - fi - if [[ '${{ matrix.sys.flags }}' == 'avx512pf' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=knl" - fi - if [[ '${{ matrix.sys.flags }}' == 'avx512vbmi' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=cannonlake" - fi - if [[ '${{ matrix.sys.flags }}' == 'avx512vbmi2' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=icelake-server" - fi - if [[ '${{ matrix.sys.flags }}' == 'avx512vnni' ]]; then - CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DTARGET_ARCH=knm" - fi if [[ '${{ matrix.sys.flags }}' == 'i386' ]]; then - CXX_FLAGS="$CXX_FLAGS -m32" + export CXXFLAGS="$CXXFLAGS -m32" fi - if [[ '${{ matrix.sys.flags }}' == 'force_no_instr_set' ]]; then - : - else + if [[ '${{ matrix.sys.flags }}' != 'force_no_instr_set' ]]; then CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DXSIMD_ENABLE_WERROR=ON" fi - # Cheap way of spotting uninitialized read - CXX_FLAGS="$CXX_FLAGS -ftrivial-auto-var-init=pattern" + # Cheap way of spotting uninitialized read; presets pick this up via $env{CXXFLAGS}. + export CXXFLAGS="$CXXFLAGS -ftrivial-auto-var-init=pattern" cmake -B _build \ + --preset ${{ matrix.sys.preset }} \ -DBUILD_TESTS=ON \ -DBUILD_BENCHMARK=ON \ -DBUILD_EXAMPLES=ON \ @@ -128,8 +104,9 @@ jobs: $CMAKE_EXTRA_ARGS \ -DCMAKE_CXX_FLAGS='$CXX_FLAGS' \ -G Ninja + - name: Build - run: cmake --build _build + run: cmake --build _build --parallel - name: Test run: | # Set CPU feature test expectations, 0 is explicit absence of the feature @@ -137,15 +114,15 @@ jobs: export XSIMD_TEST_CPU_ASSUME_RVV="0" export XSIMD_TEST_CPU_ASSUME_VSX="0" export XSIMD_TEST_CPU_ASSUME_VXE="0" - cd _build/test - if echo '${{ matrix.sys.flags }}' | grep -q 'avx512' ; then + + if echo '${{ matrix.sys.preset }}' | grep -q 'avx512' ; then # Running with emulation, must have AVX512, lower tier are checked by implications in tests export XSIMD_TEST_CPU_ASSUME_AVX512F="1" - ../../sde-external-9.48.0-2024-11-25-lin/sde64 -tgl -- ./test_xsimd + ./sde-external-9.48.0-2024-11-25-lin/sde64 -tgl -- ./_build/test/test_xsimd else export XSIMD_TEST_CPU_ASSUME_SSE4_2=$(grep -q 'sse4_2' /proc/cpuinfo && echo "1" || echo "0") export XSIMD_TEST_CPU_ASSUME_AVX=$(grep -q 'avx' /proc/cpuinfo && echo "1" || echo "0") export XSIMD_TEST_CPU_ASSUME_AVX512F=$(grep -q 'avx512f' /proc/cpuinfo && echo "1" || echo "0") export XSIMD_TEST_CPU_ASSUME_MANUFACTURER="intel,amd" - ./test_xsimd + ./_build/test/test_xsimd fi diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 000000000..005dc628a --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,202 @@ +{ + "version": 5, + "cmakeMinimumRequired": { + "major": 3, + "minor": 23, + "patch": 0 + }, + "configurePresets": [ + { + "name": "native", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=native" + } + }, + { + "name": "sse2", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -msse2 -mno-sse3" + } + }, + { + "name": "sse3", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -msse3 -mno-ssse3" + } + }, + { + "name": "ssse3", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mssse3 -mno-sse4.1" + } + }, + { + "name": "sse4.1", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -msse4.1 -mno-sse4.2" + } + }, + { + "name": "sse4.2", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -msse4.2 -mno-avx" + } + }, + { + "name": "avx", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx -mno-avx2" + } + }, + { + "name": "avx_128", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx -mno-avx2 -DXSIMD_DEFAULT_ARCH=avx_128" + } + }, + { + "name": "avx2", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx2 -mno-avx512f" + } + }, + { + "name": "avx2_128", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx2 -mno-avx512f -DXSIMD_DEFAULT_ARCH=avx2_128" + } + }, + { + "name": "avx512f", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mno-avx512cd -mno-avx512dq -mno-avx512bw -mno-avx512er -mno-avx512pf -mno-avx512ifma -mno-avx512vbmi -mno-avx512vnni" + } + }, + { + "name": "avx512cd", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mno-avx512dq -mno-avx512bw -mno-avx512er -mno-avx512pf -mno-avx512ifma -mno-avx512vbmi -mno-avx512vnni" + } + }, + { + "name": "avx512dq", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mavx512dq -mno-avx512bw -mno-avx512er -mno-avx512pf -mno-avx512ifma -mno-avx512vbmi -mno-avx512vnni" + } + }, + { + "name": "avx512bw", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mavx512dq -mavx512bw -mno-avx512er -mno-avx512pf -mno-avx512ifma -mno-avx512vbmi -mno-avx512vnni" + } + }, + { + "name": "avx512er", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mavx512dq -mno-avx512bw -mavx512er -mno-avx512pf -mno-avx512ifma -mno-avx512vbmi -mno-avx512vnni" + } + }, + { + "name": "avx512pf", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mavx512dq -mno-avx512bw -mavx512er -mavx512pf -mno-avx512ifma -mno-avx512vbmi -mno-avx512vnni" + } + }, + { + "name": "avx512ifma", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mavx512dq -mavx512bw -mno-avx512er -mno-avx512pf -mavx512ifma -mno-avx512vbmi -mno-avx512vnni" + } + }, + { + "name": "avx512vbmi", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mavx512dq -mavx512bw -mno-avx512er -mno-avx512pf -mavx512ifma -mavx512vbmi -mno-avx512vbmi2 -mno-avx512vnni" + } + }, + { + "name": "avx512vbmi2", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mavx512dq -mavx512bw -mno-avx512er -mno-avx512pf -mavx512ifma -mavx512vbmi -mavx512vbmi2 -mno-avx512vnni" + } + }, + { + "name": "avx512vnni_avx512bw", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mavx512dq -mavx512bw -mno-avx512er -mno-avx512pf -mno-avx512ifma -mno-avx512vbmi -mavx512vnni" + } + }, + { + "name": "avx512vnni_avx512vbmi2", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=x86-64 -mavx512f -mavx512cd -mavx512dq -mavx512bw -mno-avx512er -mno-avx512pf -mavx512ifma -mavx512vbmi -mavx512vbmi2 -mavx512vnni" + } + }, + { + "name": "neon", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=armv7-a -mfpu=neon -mfloat-abi=softfp" + } + }, + { + "name": "neon64", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=armv8-a" + } + }, + { + "name": "sve128", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=armv8.2-a+sve -msve-vector-bits=128" + } + }, + { + "name": "sve256", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=armv8.2-a+sve -msve-vector-bits=256" + } + }, + { + "name": "sve512", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=armv8.2-a+sve -msve-vector-bits=512" + } + }, + { + "name": "rvv128", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=rv64gcv_zvl128b_zba_zbb_zbs -mrvv-vector-bits=zvl" + } + }, + { + "name": "rvv256", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=rv64gcv_zvl256b_zba_zbb_zbs -mrvv-vector-bits=zvl" + } + }, + { + "name": "rvv512", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -march=rv64gcv_zvl512b_zba_zbb_zbs -mrvv-vector-bits=zvl" + } + }, + { + "name": "vsx2", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -mcpu=power8 -maltivec -mvsx" + } + }, + { + "name": "vsx3", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -mcpu=power9 -maltivec -mvsx" + } + }, + { + "name": "vsx4", + "cacheVariables": { + "CMAKE_CXX_FLAGS": "$env{CXXFLAGS} -mcpu=power10 -maltivec -mvsx" + } + } + ] +}