使用 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 指令,调度程序认为它比乘法和加法更快。
如果我使用 /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 指令,调度程序认为它比乘法和加法更快。