【发布时间】:2021-10-30 05:31:24
【问题描述】:
我想用ret变量来检查,我的cpu是否支持avx2:
ret = cc.compiles('''
#include <immintrin.h>
int main() {
__m256i m = _mm256_set1_epi32(17);
return sizeof(__mm256_srli_epi32(m 8);
}
''')
但我需要以某种方式添加编译标志-mavx2。
那可能吗?
我在 2019 年读到它不是,但也许它已经改变了?
【问题讨论】:
-
即使禁用了优化,也不会检查 AVX2 的可用性。请注意,
_mm256_srli_epi32(m, 8)在sizeof内,因此它永远不会执行。 GCC 甚至可以只用-mavx(godbolt.org/z/T3eKz3j3v)编译它,而不需要-mavx2或-march=znver1。更好的版本godbolt.org/z/q56r769xM 避免了这个问题,编译(使用-O0)包含一个AVX2vpsrld指令。 (其实自从我使用volatile __m256i,即使使用-O3,它也能正确测试。) -
如果构建选项有问题,您可能可以使用 GNU C
__attribute__((target("avx2")))。是的,godbolt.org/z/fxfPTWGGE 表明它适用于 GCC(和 clang/ICC)。您可以为 MSVC 使用 ifdef 它,这样您就可以将内在用于未启用的扩展。 -
见this
标签: avx2 meson-build