使用SSE2和AVX2编译库

时间:2018-10-10 17:28:57

标签: c++ visual-studio simd

如果我使用Theme.MaterialComponents Theme.MaterialComponents.NoActionBar Theme.MaterialComponents.Light Theme.MaterialComponents.Light.NoActionBar Theme.MaterialComponents.Light.DarkActionBar 编译库,但仅调用SSE2指令,则会得到“非法指令”(在/arch:AVX2上调用的第一条SSE2指令上)。但是,如果我使用_mm_set1_epi32编译lib,则在调用SSE2指令时可以正常工作。

拱形设置是否互斥?如果没有,应该如何解决?我曾尝试将共享库和静态库都存在相同的问题。

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

1 个答案:

答案 0 :(得分:2)

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

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

如果您想使用/arch开关支持的自动生成功能,通过优化的代码路径同时支持'stock'SSE / SSE2,AVX和AVX2平台,则需要三个不同的二进制文件(EXE或DLL)。 / p>

  

请参见this blog postthis one

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