繁体   English   中英

.NET上的x86 / x64 / ia64内存模型之间的差异

[英]Differences between x86/x64/ia64 memory models on .NET

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

我有一个应用程序,旨在一些非常紧张的延迟数字,并且目前只能在x86上运行,也许在x64上运行(肯定不在ia64上)。 几个我想知道我是否可以依赖x86 JIT实现的一些工件并且在x64上仍然相对安全,或者我应该编程为更宽松的ia64 JIT(这将需要更多的字段是volitile并且内存屏障插入几个地方)。

提前感谢任何指针。

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

Joe Duffy的书“Windows上的并发编程”也是有关该主题的重要信息来源。

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

此标准定义了JIT可以操作的边界。如果您希望对架构保持中立,则应遵循此标准,而不使用x86 / x64 JIT的任何细节。

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

这可能是你的水平太低了,但是如果你依赖它作为硬件非阻塞指令,那么一些较旧的AMD 64位cpus没有CMPXCHG16B( Source )。

此外,C ++的内存模型似乎也有变化,这可能是相关的,因此如果您正在执行非常低级别的代码,则可能需要留意。

CLR“指定”的内存模型是微软内部持续争论的话题(至少可以追溯到2003年 )。 作为旁注,Chris Brumme在该文章中指出x64的模型与x86相同,我认为这是用于CLR托管代码的准确语句。

除非您的目标用户明确包含Itanium,否则我认为仅仅包括一个回退,更慢但更简单和安全的实现,该架构的实现就足够了。 因此,没有必要表明您的软件在该平台上被破坏,只是它在较慢的回退模式下运行。 如果人们随后想要认真使用该平台,那么您可以编写那么宽松的模型。

请注意,x64 JIT与x86 JIT不同(因此自3.5 SP1以来非常重要),因此对一个版本的任何发布模式测试都不能代表另一个,反之亦然。 适当测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM