从 C# 检查 CPU Popcount

发布于 2024-11-08 19:26:22 字数 75 浏览 3 评论 0原文

有谁知道如何从C#检查CPU是否支持popcount(人口计数)?

我正在尝试将一些国际象棋代码从 C++ 移植到 C#。

Does anyone know how to check from C# whether the CPU supports popcount (population count)?

I'm trying to port some chess code from C++ to C#.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

む无字情书 2024-11-15 19:26:22

我还没有找到一种简单的方法来检测和使用 C# 中的特殊 CPU 指令。有多种选择,但没有一个是好的;

  • mono的函数,
  • asmjit 是一个执行 popcount x86/x64 CPUID in C#
  • 它有一个 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);
    }

I have yet to find an easy way to detect and use special CPU instructions in C#. There are several options, none of them nice;

  • asmjit a function that does popcount
  • x86/x64 CPUID in C#
  • mono has a simd library with datatype support (not popcount I guess)
  • Use a C++ DLL (probably way slower because of overhead)
  • ..

I never went that way and implemented a 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);
    }
顾铮苏瑾 2024-11-15 19:26:22

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

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

Starting in .NET Core 3.0, you can use Popcnt.IsSupported to test for the underlying hardware support.

Or, if you just need the result, use BitOperations.PopCount. The methods in the BitOperations class "use hardware intrinsics when available on the underlying platform; otherwise, they use optimized software fallbacks".

像极了他 2024-11-15 19:26:22

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

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

Since C# is compiled to IL not to machine code, you cant really do CPU level optimizations. The JIT compiler in the common language runtime is able to do some optimization when the code is actually run, but there is no direct access to that process from the language itself.

You can however mix C++ and managed code and do your low level optimizations there, but it kind of defeats the purpose of moving to C#.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文