使用 SSE2 和 AVX2 编译库

Compiling library with SSE2 and AVX2

本文关键字:编译 AVX2 SSE2 使用      更新时间:2023-10-16

使用VS2015 并编译一个同时具有 SSE2 指令和 AVX2 指令的库(仅在 CPU 中检测到时才使用(,如果我使用/arch:AVX2编译库但只调用 SSE2 指令,我会得到"非法指令"(在调用的第一个 SSE2 指令_mm_set1_epi32(。但是,如果我用/arch:SSE2编译库,它在调用 SSE2 指令时工作正常。

拱形设置是否相互排斥?如果不是,应该如何解决这个问题?我尝试了共享库和静态库,但存在相同的问题。

这是库:https://github.com/Auburns/FastNoiseSIMD,https://github.com/Auburns/FastNoiseSIMD/issues/20 有一个关于它的问题,尽管我认为它与 AVX2 打开并调用 SSE2 指令没有直接相关。

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

换句话说,您使用_mm_set1_epi32是 SSE2 指令,但由于您使用/arch:AVX2构建,因此它使用 VEX 前缀发出这些指令。/arch开关会影响显式内部函数、编译器生成的浮点数学、自动矢量化器等。

如果要同时支持"库存"SSE/SSE2、AVX 和 AVX2 平台,并使用/arch交换机支持的自动生成优化代码路径,则需要三种不同的二进制文件(EXE 或 DLL(。

请参阅此博客文章以及此博客文章

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