如果我使用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指令直接相关。
答案 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>
请注意,/arch:AVX
和/arch:AVX2
之间的主要区别在于,编译器有时会发出FMA3指令,而调度程序认为它会比乘法然后加法更快。