有没有我们可以用来进行指令集检测的宏?
我知道我们有运行时程序:
if (Avx.IsSupported)
{
//...
}
但我们是否已经定义了这方面的符号,例如。
#if AVX
//...
#endif
如果没有,我们可以创建一个或我们有一个解决办法吗?
.method public hidebysig specialname static
bool get_IsSupported () cil managed
{
// Method begins at RVA 0x142fa4
// Code size 6 (0x6)
.maxstack 8
// return IsSupported;
IL_0000: call bool System.Runtime.Intrinsics.X86.Avx::get_IsSupported()
IL_0005: ret
} // end of method Avx::get_IsSupported
ASM
代码时,我注意到以下内容:public int F()
{
if (Avx.IsSupported)
return 0;
if (Avx2.IsSupported)
return 1;
return 2;
}
ASM
Program.F()
L0000: xor eax, eax
L0002: ret
正如您所看到的,它不知怎么弄明白了Avx是受支持的,并且不包括分支。这是正常和明确的行为吗?
avx.issupport
是一个运行时特性,因为它需要动态检测实际运行代码的目标CPU的功能。
另一方面,#if
是一个编译时特性,即条件编译。使用avx
条件编译符号,然后假定目标CPU支持AVX,这实际上是没有用的。最好在运行时检查并相应地执行操作。
但是,如果您真的需要使用条件编译,您总是可以声明自己的符号。