nsimd: add v3.0.1, determine SIMD variant automatically by default (#26850)

This commit is contained in:
Erik Schnetter 2021-10-28 08:38:48 -04:00 committed by GitHub
parent 4ee37c37de
commit 7c886bcac1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -12,6 +12,7 @@ class Nsimd(CMakePackage):
maintainers = ['eschnett']
version('3.0.1', sha256='6a90d7ce5f9da5cfac872463951f3374bb0e0824d92f714db0fd4901b32497fd')
version('3.0', sha256='5cab09020ce3a6819ddb3b3b8cafa6bc1377821b596c0f2954f52c852d092d5c')
version('2.2', sha256='7916bec6c8ea9ddc690a5bfc80fb1b9402f9e1b2a4b4bb6b6bb8eb5a07eb018e')
version('2.1', sha256='3274f1061d1fac170130b8c75378a6b94580629b3dc1d53db244b51500ee4695')
@ -20,10 +21,10 @@ class Nsimd(CMakePackage):
version('1.0', sha256='523dae83f1d93eab30114321f1c9a67e2006a52595da4c51f121ca139abe0857')
variant('simd',
default='none',
default='auto',
description='SIMD instruction set',
values=(
'none',
'auto',
'CPU',
'SSE2', 'SSE42', 'AVX', 'AVX2', 'AVX512_KNL', 'AVX512_SKYLAKE',
'NEON128', 'AARCH64',
@ -35,7 +36,6 @@ class Nsimd(CMakePackage):
variant('optionals', values=any_combination_of('FMA', 'FP16'),
description='Optional SIMD features',)
conflicts('simd=none', msg="SIMD instruction set not defined")
conflicts('simd=SVE128', when=('@:1'),
msg="SIMD extension not available in version @:1")
conflicts('simd=SVE256', when=('@:1'),
@ -85,6 +85,38 @@ def generate_code(self, spec, prefix):
def cmake_args(self):
# Required SIMD argument
simd = self.spec.variants['simd'].value
if simd == 'auto':
# x86
if 'avx512' in self.spec.target:
simd = 'AVX512_SKYLAKE'
elif self.spec.satisfies('target=mic_knl'):
simd = 'AVX512_KNL'
elif 'avx2' in self.spec.target:
simd = 'AVX2'
elif 'avx' in self.spec.target:
simd = 'AVX'
elif 'sse4_2' in self.spec.target:
simd = 'SSE42'
elif 'sse2' in self.spec.target:
simd = 'SSE2'
# ARM
elif 'sve' in self.spec.target:
# We require an explicit choice for particluar bit widths
simd = 'SVE'
elif self.spec.satisfies('target=aarch64:'):
simd = 'AARCH64'
elif 'neon' in self.spec.target:
simd = 'NEON128'
# POWER
elif 'vsx' in self.spec.target:
simd = 'VSX'
elif (self.spec.satisfies('target=ppc64:') or
self.spec.satisfies('target=ppc64le:')):
simd = 'VMX'
# Unknown CPU architecture
else:
simd = 'CPU'
if self.spec.satisfies("@:1"):
cmake_args = ["-DSIMD={0}".format(simd)]
else: