可以根据CPU架构在运行时使用条件代码吗?

时间:2011-10-24 20:51:16

标签: c# multithreading .net-4.0 memory-barriers compiler-directives

我正在使用.Net 4.5(对于这个问题,预览... 4很好)。我正在做线程工作。

根据我的研究,我知道x86 CPU具有强大的内存模型,这意味着不会重新排序写入。这使释放锁定安全。对于具有弱内存模型的Itanium CPU,情况并非如此。

我理解易失性,内存障碍和执行重新排序原则。

理想情况下,我需要在关键点插入内存屏障如果 CPU是Itanium,但是如果它是x86则不会。是否有可能动态地执行此操作,就像JIT处理的运行时编译器指令一样?

如果没有,我意识到我需要为这两个平台分别构建。在这种情况下,如果没有2套C#文件,最简单的方法是什么,而只是简单地改变目标?

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

回答你的主要问题;我认为目前不可能将CIL指令有条件地编译为基于平台的机器指令(除了JIT编译器中的内容之外)。

从一组源创建两个(或更多)构建的主要工具仍为preprocessor directives