从C#检查CPU Popcount

时间:2011-05-23 13:10:08

标签: c# cpu

有没有人知道如何检查C#中的cpu是否支持popcount(人口数)? C ++很简单,但尝试使用一些国际象棋代码进行C ++到C#的转换。

非常感谢。

3 个答案:

答案 0 :(得分:4)

我还没有找到一种在C#中检测和使用特殊CPU指令的简便方法。有几个选项,没有一个很好;

  • asmjit执行popcount的功能
  • x86/x64 CPUID in C#
  • 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);
    }

答案 1 :(得分:2)

欢迎使用Stackoverflow :) 我发现这个问题似乎与这个问题类似,也许你会觉得它也很有帮助。

Elegantly determine if more than one boolean is "true"

您还可以查看c#中的bit operators以及this article

-edit -

还要更直接地解决你的问题,因为c#被编译为IL而不是机器代码,你不能真正做cpu级优化。公共语言运行库中的JIT编译器能够在实际运行代码时进行一些优化,但是没有从语言本身直接访问该进程。

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

答案 2 :(得分:0)

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

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