【发布时间】:2021-06-29 09:58:27
【问题描述】:
有没有可以用于指令集检测的宏?
我知道我们有运行时的:
if (Avx.IsSupported)
{
//...
}
但是我们是否为此定义了符号,例如
#if AVX
//...
#endif
如果没有,我们可以创建一个吗?或者我们有解决方法吗?
注意
- 在使用反编译器时,我发现了一个奇怪的“递归”。但我认为 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 并且不包含分支。这是正常且定义明确的行为吗?
【问题讨论】:
-
编译器指令的问题在于它们被检查编译时间(c# => MSIL)所以你需要知道你正在为哪个目标系统编译。
-
@JeroenvanLangen MSVC 没有宏
__AVX__?他们如何预测? -
@Hrant C/C++ AFAIK 是按平台编译生成可执行文件,而 C# 编译结果是 IL 代码,稍后将在客户端计算机上(通过 JIT)处理
-
@harold 随机问题:如果我有多个
ifs 每次都检查相同的东西,那不会比只获取一次 cpuid 的宏效率低吗? (我假设这就是您对 使用宏进行条件编译 的意思)...我想我可以存储 bool 并重用它。 -
Is this a normal and well defined behaviour?是的。
标签: c# simd intrinsics