使用VS2015并编译一个具有SSE2指令和AVX2指令的库(只有在CPU中检测到时才使用),如果我用/arch:AVX2
编译库,但只调用SSE2指令,则会得到“非法指令”(在_mm_set1_epi32
第一个SSE2指令上调用)。但是,如果我用/arch:SSE2
编译库,那么在调用SSE2指令时它可以正常工作。
拱形设置相互排斥吗?如果不是的话,如何解决呢?我尝试使用相同的问题作为共享库和静态库。
这是lib:https://github.com/Auburns/FastNoiseSIMD,还有一个问题,https://github.com/Auburns/FastNoiseSIMD/issues/20,虽然我不认为它与AVX2打开并调用SSE2指令直接相关。
发布于 2018-10-10 18:45:35
如果使用/arch:AVX
或/arch:AVX2
进行构建,主要影响是编译器生成的所有SSE代码都将使用VEX前缀编码,从而允许更有效地调度寄存器。如果您在没有AVX或AVX2支持的系统上运行这样的代码,它实际上会导致非法指令的错误。
换句话说,您使用的_mm_set1_epi32
是一个SSE2指令,但是由于您使用/arch:AVX2
构建,所以它使用VEX前缀发出这些指令。/arch
开关会影响显式本质、编译器生成的浮点数学、自动向量器等.
如果您希望使用由AVX2交换机支持的自动生成来支持SSE/SSE 2、AVX和AVX2平台的优化代码路径,则需要三个不同的二进制文件(EXEs或DLL)。
注意,/arch:AVX
和/arch:AVX2
之间的主要区别是编译器有时会发出FMA3指令,调度程序认为它比乘法要快得多。
https://stackoverflow.com/questions/52745772
复制相似问题