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

Posted

技术标签:

【中文标题】可以基于 CPU 架构在运行时使用条件代码吗?【英文标题】:Can one have conditional code at runtime based on the CPU architecture? 【发布时间】:2011-10-24 20:51:15 【问题描述】:

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

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

我了解易失性、内存屏障和执行重新排序原则。

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

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

【问题讨论】:

CLR 的工作是向您隐藏这些差异。 Itanium 版本具有非常不同的锁定原语实现。避免不利用这一点。 ***.com/questions/3855671/… 如果您想对机器进行编程,请切换到 C++。 @HansPassant 是的,但这并不能否定在 IA64 上而不是 x86/x86-64 上释放锁之前使用内存屏障的需要。 @DavidHeffernan 这无济于事。在 C++ 中,我肯定必须为每个平台系列拥有单独的项目。 @HansPassant 我正在大量使用 CompareExchange。事实上,我在需要锁的一种情况下使用它。但这是题外话。我不确定你为什么引用。你的其他答案。 【参考方案1】:

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

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

【讨论】:

+1; ...您将通过 per-build-configuration 定义进行设置。 我想知道 MS 是否会包含条件 JIT 指令。这不是一个坏主意:)【参考方案2】:

我不知道这是否会对您有所帮助,但此答案中描述了几个选项:

What is the most reliable way to detect windows OS Architecture (x86,x64) on .NET 2.0

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

【讨论】:

以上是关于可以基于 CPU 架构在运行时使用条件代码吗?的主要内容,如果未能解决你的问题,请参考以下文章

在win10手机上能运行exe程序吗

如何在国产龙芯架构平台上运行c/c++javanodejs等编程语言

Diesel 可以在运行时更改架构吗?

您如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型?

基于ARM64的CPU架构下的docker-compose安装

CPU 100% 运行时?