5

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

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

在此先感谢您的任何指点。

4

3 回答 3

5

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

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

于 2009-04-20T12:49:14.470 回答
0

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

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

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

于 2009-04-20T12:48:53.223 回答
0

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

此外,C++ 的内存模型似乎也发生了变化,这可能是相关的,因此如果您正在执行非常低级的代码,您可能需要密切关注。

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

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

Note that the x64 JIT is different to the x86 JIT (significantly so since 3.5 SP1) so any Release Mode testing on one is not representative of the other and vice versa. Test as appropriate.

于 2009-04-20T13:24:42.763 回答