正在从C#检查CPU Popcount



有人知道如何从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.PopCountBitOperations类中的方法"在底层平台上可用时使用硬件内部函数;否则,它们使用优化的软件回退"。

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

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

相关内容

  • 没有找到相关文章

最新更新