在运行时,是否可以根据CPU架构有条件地编写代码?

4
我正在使用.Net 4.5(预览版... 4版本对于这个问题来说也是可以的)。我正在进行线程工作。
根据我的研究,我知道x86 CPU有一个强大的内存模型,这意味着写入不会被重新排序。这使得释放锁是安全的。但Itanium CPU则不然,它们有一个弱内存模型。
我了解volatile、内存屏障和执行重排序原理。
理想情况下,如果CPU是Itanium,我需要在关键点插入内存屏障,但如果CPU是x86,则不需要。是否可能在运行时动态地执行此操作,即具有JIT处理的运行时编译器指令?
如果不行,我意识到我需要为两个平台分别构建。在这种情况下,最优雅的方法是什么?是否有2组C#文件而不是仅更改目标,即只需更改目标即可完成此操作?

6
CLR的工作是向用户隐藏这些差异。Itanium版本具有非常不同的锁原语实现,请勿放弃利用它。https://dev59.com/YW865IYBdhLWcg3wW9RE#3855824 - Hans Passant
如果你想要编写机器程序,请转向C++。 - David Heffernan
@HansPassant 我在大量使用 CompareExchange。实际上,我在需要获取锁的情况下使用它。但这与主题无关。我不确定您为什么提到了其他答案。 - IamIC
CLR的内存模型很重要。 - David Heffernan
@DavidHeffernan,关于这个问题的专业文本与您所说的不同。请参见http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility。 - IamIC
显示剩余7条评论
2个回答

1

我不知道这个能否帮到你,但是在这个答案中描述了几个选项:

在另一个答案中,有人提供了一个链接,链接指向以下示例代码(来自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;
    }
}

1
作为对你的主要问题的回答;我认为目前不可能根据平台对CIL指令进行有条件地编译成机器指令(除了已经嵌入JIT编译器中的内容)。
创建一个源的两个(或更多)构建的主要工具仍然是预处理器指令

+1;...这可以通过每个构建配置定义来设置。 - Merlyn Morgan-Graham
我想知道微软是否会包含条件JIT指令。这不是一个坏主意 :) - IamIC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接