2011-05-23 64 views
1

有誰知道如何檢查C#中的CPU,如果它支持popcount(人口數量)? C++很容易,但試圖用一些國際象棋代碼做一些C++到C#的轉換。從C#檢查CPU數量#

非常感謝。

+0

您是否需要在特定時間點查找CPU使用情況? – 2011-05-23 13:25:32

+0

在C++中,這需要特定於實現的編譯器,例如, '__builtin_popcount'(用於gcc)。 – 2011-05-23 13:49:51

回答

2

歡迎來到Stackoverflow :) 我發現這個問題,似乎是這個類似,也許你會發現它也很有幫助。

Elegantly determine if more than one boolean is "true"

您也可以看看bit operators是在C#以及this article

CNC中

而且更直接awnser你的問題,因爲C#編譯爲IL不到機器代碼,你真的不能做cpu級別的優化。公共語言運行庫中的JIT編譯器能夠在代碼實際運行時進行一些優化,但不能從語言本身直接訪問該進程。

但是,您可以混合使用C++和託管代碼,做你的低級別的優化存在,但它那種失敗移動到C#

+0

非常感謝您的信息。我會檢查出來的。 – David 2011-05-23 13:47:53

3

我還沒有找到一個簡單的方法來檢測,並使用特殊的CPU指令的目的在C#中。有幾種選擇,沒有一個很好。

  • 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); 
    }