.NET中x86/x64/ia64内存模型的区别

5
我正在寻找有关.NET CLR/JIT在x86/x64/ia64上使用的内存模型差异的参考资料。我知道x86和ia64之间存在一些差异(指令重排序、指令删除等),但我还没有找到有关x86和x64之间差异的参考资料。
我有一个应用程序,它的目标是实现非常紧密的延迟时间,在此时只能在x86上运行,并且可能在x64上运行(绝对不会在ia64上运行)。我想知道是否可以依赖于x86 JIT实现的某些特性,并在x64上仍然相对安全,或者是否应该编写松散的ia64 JIT(这将需要更多的字段是易失性的,并在几个地方插入内存屏障)。
感谢您提供任何指针。

1
如果内存时序紧张,为什么要使用 .NET?C++ 不是更好吗? - gbn
时间紧迫,但开发时间仍然很重要。此外,我们还需要链接一些已经开发好的.Net库。在C++中构建这部分并通过PInvoke调用并不是不可能的,但必须通过性能测试来证明。我正在努力让.Net代码尽可能地表现出色,然后再考虑采取其他方案。 - Jonathan Rupp
3个回答

5

有两篇关于.NET内存模型的文章(顺便提一下,这个模型比ECMA模型更强):

Joe Duffy的书《Windows并发编程》也是这个主题的一个很好的信息来源。


你能否总结一下与ECMA模型的区别? - grover
第一篇链接的文章比我能做得更好。 - Jon Skeet
第二个链接似乎不再可用了,但是您可以通过访问http://www.bluebytesoftware.com/blog/SearchView.aspx?q=memory并搜索CLR 2.0内存模型来获取访问权限。 - Felix Dombek

0

.NET内存模型在ECMA规范ISO/IEC-23271中有所说明。具体而言,在第I部分:概念和架构,第12.6章“内存模型和优化”中。

该标准定义了JIT可以操作的边界。如果您想对架构保持中立,应遵循此标准,不利用x86/x64 JIT的任何特定内容。

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


这定义了ECMA模型 - .NET模型略微更强,因此更容易编写。 - Jon Skeet
顺便提一下,x86和x64的JIT实际上已经有了很大的分歧(以前x64在大多数方面都更优秀,现在变得更加有趣了)。希望它们能够更加一致(请原谅我这个双关语)。 - ShuggyCoUk
但仅限于他们所编写代码的质量。 - grover

0

这可能对您来说过于低级了,但一些旧的 AMD 64 位 CPU 没有 CMPXCHG16B(来源),如果您依赖它作为硬件非阻塞指令,则会出现问题。

此外,C++ 的内存模型似乎有变化,这可能是相关的,因此如果您正在进行非常低级别的代码编写,可能需要注意一下。

CLR 指定的内存模型是微软公司内部持续争论的话题(至少在2003年之前就公开讨论了)。顺便提一下,Chris Brumme 在那篇文章中指出,x64 的模型与 x86 相同,我认为这对于 CLR 托管代码的目的是准确的陈述。

除非你的目标用户明确包括Itanium,否则我认为只需为该架构包含一个回退、更慢但简单安全的实现即可保证正确性。然后就没有必要指出你的软件在该平台上出现故障,只需表明它以更慢的回退模式运行。如果人们随后想要严肃地使用该平台,你可以编写到那个松散的模型。

请注意,x64 JIT与x86 JIT不同(自3.5 SP1以来显著不同),因此对其中一个进行Release Mode测试并不能代表另一个,反之亦然。适当测试。


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