4

我正在使用.Net 4.5(預覽... 4對於此問題目的不錯)。我在做線程工作。根據CPU架構,運行時可以有條件代碼嗎?

基於我的研究,我知道x86 CPU具有強大的內存模型,這意味着寫操作不會被重新排序。這使得釋放鎖安全。對於內存模型較弱的安騰CPU來說,情況並非如此。

我瞭解易失性,內存障礙和執行重新排序原則。

我理想的需求是在關鍵點插入內存障礙如果 CPU是Itanium,但不是x86。是否有可能動態地做到這一點,就像JIT進程中有運行時編譯器指令一樣?

如果沒有,我意識到我需要爲這兩個平臺分別構建。在那種情況下,如果沒有2套C#文件,而只是簡單地改變目標,那麼最簡單的方法是什麼?

+6

CLR的工作是將這些差異隱藏起來。 Itanium版本具有非常不同的鎖定原語實現。避免不要利用這一點。 http://stackoverflow.com/questions/3855671/how-do-i-atomically-swap-2-ints-in-c/3855824#3855824 –

+0

如果你想編程機器,切換到C++。 –

+0

@HansPassant是的,但是這並不否定在IA64上鎖定發佈之前使用內存屏障的必要性,而不是在x86/x86-64上不使用內存屏障。 – IamIC

回答

1

在回答您的主要問題;我不認爲現在有可能有條件編譯CIL指令來基於平臺來加工指令(除了燒入JIT編譯器的內容)。

從一組源創建兩個(或更多)版本的主要工具仍然是preprocessor directives

+0

+1; ...你可以通過per-build-configuration定義。 –

+0

我想知道MS是否會包含條件JIT指令。這不是一個壞主意:) – IamIC

1

我不知道這是否會幫助你或沒有,但有一對夫婦在這個答案中描述的選項:

在另一個答案,有人提供了一個鏈接以下示例代碼(來自Paint.NET)來確定OS體系結構。你可以做一個小的調整包括IA64檢查:

private enum Platform 
{ 
    X86, 
    X64, 
    Unknown 
} 

internal const ushort PROCESSOR_ARCHITECTURE_INTEL = 0; 
internal const ushort PROCESSOR_ARCHITECTURE_IA64 = 6; 
internal const ushort PROCESSOR_ARCHITECTURE_AMD64 = 9; 
internal const ushort PROCESSOR_ARCHITECTURE_UNKNOWN = 0xFFFF; 

[StructLayout(LayoutKind.Sequential)] 
internal struct SYSTEM_INFO 
{ 
    public ushort wProcessorArchitecture; 
    public ushort wReserved; 
    public uint dwPageSize; 
    public IntPtr lpMinimumApplicationAddress; 
    public IntPtr lpMaximumApplicationAddress; 
    public UIntPtr dwActiveProcessorMask; 
    public uint dwNumberOfProcessors; 
    public uint dwProcessorType; 
    public uint dwAllocationGranularity; 
    public ushort wProcessorLevel; 
    public ushort wProcessorRevision; 
}; 

[DllImport("kernel32.dll")] 
internal static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo);   

private static Platform GetPlatform() 
{ 
    SYSTEM_INFO sysInfo = new SYSTEM_INFO(); 
    GetNativeSystemInfo(ref sysInfo); 

    switch (sysInfo.wProcessorArchitecture) 
    { 
     case PROCESSOR_ARCHITECTURE_AMD64: 
      return Platform.X64; 

     case PROCESSOR_ARCHITECTURE_INTEL: 
      return Platform.X86; 

     default: 
      return Platform.Unknown; 
    } 
}