使用 SSE2 和 AVX2 编译库

Compiling library with SSE2 and AVX2

如果我使用 /arch:AVX2 编译库但只调用SSE2 指令我得到 "illegal instruction"(在 _mm_set1_epi32 调用的第一个 SSE2 指令上)。但是,如果我用 /arch:SSE2 编译库,它在调用 SSE2 指令时工作正常。

arch 设置是否相互排斥?如果不是,应该如何解决?我曾尝试将其作为共享库和静态库来解决同样的问题。

这是库:https://github.com/Auburns/FastNoiseSIMD and there is an issue about it https://github.com/Auburns/FastNoiseSIMD/issues/20,虽然我不认为它直接与 AVX2 相关并调用 SSE2 指令。

如果您使用 /arch:AVX/arch:AVX2 构建,主要 影响是编译器生成的所有 SSE 代码都将使用 VEX prefix编码允许更有效地调度寄存器。如果您 运行 在不支持 AVX 或 AVX2 的系统上使用此类代码,它实际上会因非法指令而出错。

换句话说,您对 _mm_set1_epi32 的使用是一条 SSE2 指令,但是因为您使用 /arch:AVX2 进行构建,它使用 VEX 前缀发出了这些指令。 /arch 开关会影响显式内在函数、编译器生成的浮点数学运算、自动向量化器等。

如果您希望使用 /arch 开关支持的自动生成来支持具有优化代码路径的 'stock'、AVX 和 AVX2 平台,您需要三个不同的二进制文件( EXE 或 DLL)。

See this blog post as well as this one

请注意 /arch:AVX/arch:AVX2 之间的主要区别是,编译器有时会发出 FMA3 指令,调度程序认为它比乘法和加法更快。