【问题标题】:Differences between x86/x64/ia64 memory models on .NET.NET 上 x86/x64/ia64 内存模型之间的差异
【发布时间】:2010-10-20 13:33:26
【问题描述】:

我正在寻找有关 x86/x64/ia64 上 .NET CLR/JIT 使用的内存模型之间差异的参考。我知道 x86 和 ia64 之间存在一些差异(指令重新排序、指令删除等),但我还没有找到关于 x86 和 x64 之间差异的参考。

我有一个应用程序,它的目标是一些非常严格的延迟数字,并且此时只能在 x86 上运行,也许在 x64 上(肯定不在 ia64 上)。我想知道我是否可以依赖 x86 JIT 实现的一些工件并且在 x64 上仍然相对安全,或者我是否应该对更松散的 ia64 JIT 进行编程(这将需要更多字段是易变的,并且在几个地方)。

提前感谢您的任何指点。

【问题讨论】:

  • 如果内存时间很紧,为什么要使用 .net? c++会不会更好?
  • 时间紧迫,但开发时间仍然很重要。此外,我们还有许多需要链接到的已开发的 .Net 库。用 C++ 构建这部分并通过 PInvoke 调用它并不是不可能的,但必须通过性能数来证明。在我们“放弃”并走这条路之前,我正在努力让 .Net 代码尽可能好地执行。

标签: .net x86 64-bit memory-model itanium


【解决方案1】:

两篇关于.NET内存模型的文章(比ECMA模型强,顺便说一句):

Joe Duffy 的书 Concurrent Programming on Windows 也是有关该主题的重要信息来源。

【讨论】:

【解决方案2】:

.NET 内存模型在 ECMA 规范 ISO/IEC-23271 中指定。特别是在第一部分:概念和架构,第 12.6 章“内存模型和优化”中。

此标准定义了 JIT 可能在其中运行的边界。如果您想对架构保持中立,则应遵循此标准并且不使用 x86/x64 JIT 的任何细节。

此外,x64 是 x86 的演变,它主要由附加指令、寄存器和一些扩展 (SSE2) 组成,被定义为所有 x64 兼容处理器的基线。内存模型几乎没有变化,除了额外的地址空间和额外的寻址模式(指令指针相关的数据访问)。因此,针对 x86 JIT 进行优化也应该在 x64 上产生良好的结果。

【讨论】:

  • 这定义了 ECMA 模型 - .NET 模型稍强一些,因此更容易编写。
  • 作为旁注,x86 和 x64 JIT 实际上只是有很大的不同(以前 x64 在大多数方面都比较出色,现在它更有趣了)希望它们能够更加内联(原谅双关语)
  • 但仅限于他们生成的代码的质量。
【解决方案3】:

这可能对你来说太低了,但一些较旧的 AMD 64 位 cpu 没有 CMPXCHG16B (Source) 如果您依赖它作为硬件非阻塞指令。

似乎还有changes in the memory model for C++ 可能是相关的,因此如果您正在编写非常低级的代码,您可能需要留意。

CLR“指定”的内存模型是微软内部争论不休的话题(至少早在2003就公开讨论过)。作为旁注,Chris Brumme 在该文章中指出,x64 的模型与 x86 相同,我认为对于 CLR 托管代码而言这是一个准确的陈述。

除非您的目标用户明确包含 Itanium,否则我认为只需包含一个后备、较慢但简单且安全,该架构的实现就足以保证正确性。这样就无需指出您的软件在该平台上已损坏,只需说明它以较慢的回退模式运行。如果人们随后想认真使用该平台,您可以编写更宽松的模型。

请注意,x64 JIT 与 x86 JIT 不同(自 3.5 SP1 以来明显如此),因此任何发布模式测试都不能代表另一个,反之亦然。酌情进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2018-01-13
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多