有人知道如何从C#检查CPU是否支持popcount(人口计数)吗?
我正在尝试将一些棋类代码从C++移植到C#。
有人知道如何从C#检查CPU是否支持popcount(人口计数)吗?
我正在尝试将一些棋类代码从C++移植到C#。
我从来没有走过这条路并且实现了一个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);
}
BitOperations.PopCount
会使用什么回退方法,但我希望它是那个众所周知的bithack。我假设这个答案是在BitOperations.PopCount
出现之前写的(https://learn.microsoft.com/en-us/dotnet/api/system.numerics.bitoperations.popcount?view=net-7.0),因为那个应该至少和bithack一样好,而且希望更好。 - Peter Cordes从.NET Core 3.0开始,您可以使用Popcnt.IsSupported
来测试底层硬件的支持情况。
或者,如果您只需要结果,可以使用BitOperations.PopCount
。在BitOperations
类中的方法“在基础平台上可用硬件内部机制时使用;否则,它们使用优化的软件回退”。
由于C#编译为IL而不是机器码,因此您无法进行CPU级别的优化。通用语言运行时中的JIT编译器能够在实际运行代码时进行一些优化,但语言本身没有直接访问该过程的权限。
但是,您可以混合使用C++和托管代码,并在那里进行低级别的优化,但这有点违背了转向C#的初衷。
__builtin_popcount
(用于gcc)。 - Ben Voigt