是否有用于 SIMD 指令集的宏?
Are there macros for SIMD instruction sets?
是否有任何宏可用于指令集检测?
我知道我们有运行时的:
if (Avx.IsSupported)
{
//...
}
但是我们是否已经为此定义了符号,例如
#if AVX
//...
#endif
如果有 none,我们可以创建一个吗?或者我们有解决方法吗?
注意
- 在使用反编译器时,我发现了一个奇怪的“递归”。但我认为 ILSpy 错过了这里。
.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.IsSupported
是一个 运行-time 特性,因为它需要动态检测您的代码所在的目标 CPU 的功能实际上是 运行.
另一方面,#if
是一个编译时 特性,条件编译。拥有一个 AVX
条件编译符号并假设目标 CPU 确实支持 AVX 并不是很有用。最好检查 运行-time 并相应地进行操作。
但是,如果您确实需要使用条件编译,您可以随时声明自己的符号。
是否有任何宏可用于指令集检测?
我知道我们有运行时的:
if (Avx.IsSupported)
{
//...
}
但是我们是否已经为此定义了符号,例如
#if AVX
//...
#endif
如果有 none,我们可以创建一个吗?或者我们有解决方法吗?
注意
- 在使用反编译器时,我发现了一个奇怪的“递归”。但我认为 ILSpy 错过了这里。
.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.IsSupported
是一个 运行-time 特性,因为它需要动态检测您的代码所在的目标 CPU 的功能实际上是 运行.
另一方面,#if
是一个编译时 特性,条件编译。拥有一个 AVX
条件编译符号并假设目标 CPU 确实支持 AVX 并不是很有用。最好检查 运行-time 并相应地进行操作。
但是,如果您确实需要使用条件编译,您可以随时声明自己的符号。