我有一个应用程序,它的目标是实现非常紧密的延迟时间,在此时只能在x86上运行,并且可能在x64上运行(绝对不会在ia64上运行)。我想知道是否可以依赖于x86 JIT实现的某些特性,并在x64上仍然相对安全,或者是否应该编写松散的ia64 JIT(这将需要更多的字段是易失性的,并在几个地方插入内存屏障)。
感谢您提供任何指针。
有两篇关于.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 位 CPU 没有 CMPXCHG16B(来源),如果您依赖它作为硬件非阻塞指令,则会出现问题。
此外,C++ 的内存模型似乎有变化,这可能是相关的,因此如果您正在进行非常低级别的代码编写,可能需要注意一下。
CLR 指定的内存模型是微软公司内部持续争论的话题(至少在2003年之前就公开讨论了)。顺便提一下,Chris Brumme 在那篇文章中指出,x64 的模型与 x86 相同,我认为这对于 CLR 托管代码的目的是准确的陈述。
除非你的目标用户明确包括Itanium,否则我认为只需为该架构包含一个回退、更慢但简单安全的实现即可保证正确性。然后就没有必要指出你的软件在该平台上出现故障,只需表明它以更慢的回退模式运行。如果人们随后想要严肃地使用该平台,你可以编写到那个松散的模型。
请注意,x64 JIT与x86 JIT不同(自3.5 SP1以来显著不同),因此对其中一个进行Release Mode测试并不能代表另一个,反之亦然。适当测试。