Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 53 additions & 76 deletions .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,64 +10,71 @@ 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 }}
sudo apt-get update || exit 1
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 }}
Expand All @@ -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 \
Expand All @@ -128,24 +104,25 @@ 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
export XSIMD_TEST_CPU_ASSUME_NEON64="0"
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 -skx -- ./_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
202 changes: 202 additions & 0 deletions CMakePresets.json
Original file line number Diff line number Diff line change
@@ -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"
}
}
]
}
Loading