4

私は.Net 4.5を使用しています(プレビュー...この質問の目的上、4は問題ありません)。私はスレッド作業をしています。実行時にCPUアーキテクチャーに基づいて条件付きコードを使用できますか?

私の研究によると、x86 CPUは強力なメモリモデルを持っていることがわかっています。つまり、書き込みは並べ替えられません。これによりロック解除が安全になります。これは、メモリモデルが脆弱なItanium CPUでは当てはまりません。

私は、揮発性、メモリバリア、実行順序の原則を理解しています。

私が理想的に必要とするのは、の場合にはの場合はCPUがItaniumですが、x86の場合はメモリ障壁を挿入することです。 JITが処理する実行時コンパイラ指令を持つように、これを動的に行うことは可能ですか?

もしそうでなければ、2つのプラットフォーム用に別々のビルドが必要になることがわかります。その場合、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はい、それはx86/x86-64ではなく、IA64上のロックリリースの前にメモリバリアが使用される必要性を否定しません。 – IamIC

答えて

1

を。現在、CIL命令を条件付きでコンパイルしてプラットフォームに基づいた命令をコンパイルすることはできません(JITコンパイラに組み込まれているものを除く)。

ソースセットから2つ(またはそれ以上)のビルドを作成するための主なツールは、まだpreprocessor directivesです。

+0

+1; ...これはビルド構成ごとの定義で設定します。 –

+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; 
    } 
} 
関連する問題