有人知道如何从C#中检查CPU是否支持popcount(population count)吗?
我正在尝试将一些国际象棋代码从C++移植到C#。
我还没有找到一种简单的方法来检测和使用C#中的特殊CPU指令。有几种选择,没有一种是好的;
- asmjit一个执行popcount的函数
- C中的x86/x64 CPUID#
- mono有一个支持数据类型的simd库(我想不是popcount)
- 使用C++DLL(可能由于开销而速度较慢)
我从来没有这样做过,并实现了一个C#popcount;
/// <summary>
/// Count the number of bits set to 1 in a ulong
/// </summary>
public static byte BitCount(this ulong value)
{
ulong result = value - ((value >> 1) & 0x5555555555555555UL);
result = (result & 0x3333333333333333UL) + ((result >> 2) & 0x3333333333333333UL);
return (byte)(unchecked(((result + (result >> 4)) & 0xF0F0F0F0F0F0F0FUL) * 0x101010101010101UL) >> 56);
}
从.NET Core 3.0开始,您可以使用Popcnt.IsSupported
来测试底层硬件支持。
或者,如果您只需要结果,请使用BitOperations.PopCount
。BitOperations
类中的方法"在底层平台上可用时使用硬件内部函数;否则,它们使用优化的软件回退"。
由于C#是编译到IL而不是机器代码的,因此您无法真正进行CPU级别的优化。公共语言运行库中的JIT编译器能够在代码实际运行时进行一些优化,但语言本身无法直接访问该进程。
然而,您可以混合C++和托管代码,并在那里进行低级别优化,但这有点违背了迁移到C#的目的。