我正在寻找关于x86 / x64 / ia64上.NET CLR / JIT使用的内存模型之间差异的参考。我知道x86和ia64之间存在一些差异(指令重新排序,指令删除等),但我没有找到x86和x64之间差异的参考。
我有一个针对一些非常紧张的延迟数的应用程序,并且此时只能在x86上运行,也许在x64上运行(肯定不在ia64上)。几个我想知道我是否可以依赖x86 JIT实现的一些工件并且在x64上仍然相对安全,或者我应该编程为更宽松的ia64 JIT(这将需要更多的字段是volitile并且内存屏障插入几个位)。
提前感谢任何指示。
答案 0 :(得分:5)
关于.NET内存模型的两篇文章(比ECMA模型强,顺便说一句):
Joe Duffy的书Concurrent Programming on Windows,也是这个主题的重要信息来源。
答案 1 :(得分:0)
.NET内存模型在ECMA规范ISO / IEC-23271中指定。特别是在分区I:概念和体系结构,第12.6章“内存模型和优化”中。
此标准定义了JIT可以操作的边界。如果您希望对架构保持中立,则应遵循此标准,而不使用x86 / x64 JIT的任何细节。
此外,x64是对x86的演进,它主要由附加指令,寄存器和一些扩展(SSE2)组成,被定义为所有x64兼容处理器的基线。除了额外的地址空间和额外的寻址模式(指令指针相对数据访问)之外,内存模型几乎没有变化。因此,对x86 JIT的优化也应该在x64上产生良好的结果。
答案 2 :(得分:0)
这可能对你来说太低了,但是一些旧的AMD 64位cpus没有CMPXCHG16B (Source)如果你依赖它作为硬件非阻塞指令。
此外,似乎changes in the memory model for C++可能是相关的,因此如果你的代码非常低,你可能需要留意。
CLR“指定”的内存模型是微软内部持续争论的主题(至少在2003之前公开讨论过)。作为旁注,Chris Brumme在该文章中指出x64的模型与x86相同,我认为这是用于CLR托管代码的准确语句。
除非您的目标用户明确包含Itanium,否则我认为只需包含一个回退,更慢但更简单和安全的实现,该架构的实现就足够了。因此,没有必要表明您的软件在该平台上被破坏,只是它在较慢的回退模式下运行。如果人们随后想要认真使用该平台,您可以编写很多更宽松的模型。
请注意,x64 JIT与x86 JIT不同(因为3.5 SP1以来非常重要),因此对一个版本的任何发布模式测试都不能代表另一个,反之亦然。适当地进行测试。