4

私は.Net4.5を使用しています(プレビュー... 4はこの質問の目的には問題ありません)。私は糸脱毛の仕事をしています。

私の調査によると、x86 CPUには強力なメモリモデルがあり、書き込みが並べ替えられないことを意味します。これにより、ロックを安全に解放できます。これは、メモリモデルが弱いItaniumCPUには当てはまりません。

揮発性、メモリバリア、および実行の並べ替えの原則を理解しています。

理想的には、CPUがItaniumの場合はキーポイントにメモリバリアを挿入しますが、x86の場合は挿入しません。JITが処理するランタイムコンパイラ指令のように、これを動的に行うことは可能ですか?

そうでない場合は、2つのプラットフォーム用に別々のビルドが必要になることに気付きました。その場合、2セットのC#ファイルを使用せずに、ターゲットを変更するだけでこれを行うための最も洗練された方法は何ですか?

4

2 に答える 2

1

これがあなたに役立つかどうかはわかりませんが、この回答で説明されているオプションがいくつかあります。

別の回答では、誰かがOSアーキテクチャを決定するために(Paint.NETからの)次のサンプルコードへのリンクを提供しました。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;
    }
}
于 2011-10-24T21:31:46.027 に答える
1

あなたの主な質問に答えて; 現在、CIL命令を、プラットフォームに基づいたマシン命令に条件付きでコンパイルすることはできないと思います(JITコンパイラーに組み込まれているものを除く)。

1セットのソースから2つ(またはそれ以上)のビルドを作成するための主要なツールは、依然としてプリプロセッサディレクティブです。

于 2011-10-26T03:34:24.827 に答える