2016-01-21 92 views
-1

我有一臺超過31個cpu內核的電腦。我想爲31號以後的cpu核心分配一個進程。我的問題是IntPtr在這臺機器上解析爲32位整數。它是一個運行64位操作系統的64位機器。這似乎違背什麼是微軟hereC#IntPtr和ProcessorAffinity - 如何超過32位?

的IntPtr的類型被設計爲一個整數,其大小爲 平臺的具體說明。也就是說,這種類型的實例預計在32位硬件和操作系統上爲32位,在64位硬件和操作系統上爲64位。

這裏是我正在構建的IntPtr:

public static IntPtr GetCpuBinaryValue(int cpuIndex) 
{ 
    // The IntPtr type is designed to be an integer whose size is platform - specific. 
    // That is, an instance of this type is expected to be 32 - bits on 32 - bit hardware and operating systems, 
    // and 64 - bits on 64 - bit hardware and operating systems. 


    IntPtr ptr = new IntPtr(Convert.ToInt64(Math.Pow(2, cpuIndex))); 
    return ptr; 
} 

,並繼續例子,這裏是我設置的處理器親和性:

using System.Diagnostics; 
... 
    // set which processor to run the process on 
       process.ProcessorAffinity = GetCpuBinaryValue(coreIndex); 
... 

例如,我可以通過在值爲「0」,它將返回一個帶有00000000掩碼的IntPtr(32位)0000000000000000000000000001

如果我傳入「31」,它將會返回E打開千萬00000000 00000000 00000000

我的願望是,它強制轉換爲64位,例如,如果我通過在值「32」,則回覆:00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

有一種解決這個問題的方法?它固執地停留在32位。

+0

你試圖通過這樣做解決什麼問題? –

+0

這是底層winapi函數SetProcessAffinityMask()中的一個限制。在32位模式下,它只能處理32個處理器。如果你不能碰到AnyCPU,你可以做什麼,你的硬件比你的軟件強大得多。 –

回答

1

您可能正在運行x86Any CPUIntPtr是平臺特定的,但它也取決於進程本身。如果進程以64位模式運行,則指針將爲64位,如果進程以32位運行,則指針將爲32位。

如果切換爲明確運行x64(如How to: Configure Projects to Target Platforms中所述),則溢出異常消失,並且正確的值似乎存儲在返回值中。

+0

對其他任何人堅持的一個側面說明:所有項目和可執行文件必須是64位才能使用。在我的情況下 - 雖然我已經設置了64位主要的「控制檯啓動」應用程序 - 它已經使用了第二個編譯爲32位的控制檯。 – sapbucket