从C#检查CPU Popcount

Dav*_*vid 2 c# cpu

有谁知道如何在C#中检查cpu是否支持popcount(人口计数)?C ++很简单,但是尝试通过一些象棋代码将C ++转换为C#。

非常感谢。

Bra*_*ger 7

从 .NET Core 3.0 开始,您可以用来Popcnt.IsSupported测试底层硬件支持。

或者,如果您只需要结果,请使用BitOperations.PopCount. 该类中的方法BitOperations“在底层平台上可用时使用硬件内在函数;否则,它们使用优化的软件后备”。


Ivo*_*ops 5

我还没有找到一种简单的方法来检测和使用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);
    }
Run Code Online (Sandbox Code Playgroud)


aL3*_*891 3

由于 C# 被编译为 IL 而不是机器代码,因此您无法真正进行 CPU 级别的优化。公共语言运行时中的 JIT 编译器能够在代码实际运行时进行一些优化,但语言本身无法直接访问该过程。

然而,您可以混合 C++ 和托管代码并在那里进行低级优化,但这有点违背了迁移到 C# 的目的。