我正在查看一些稍微混淆的代码,这些代码尝试使用各种编译器内置函数对预取指令进行平台抽象。它最初似乎基于 powerpc 语义,分别使用 dcbt 和 dcbtst 读取和写入预取变体(这两个都在新的可选流操作码中传递 TH=0)。
在 ia64 平台上,我们可以阅读:
__lfetch(__lfhint_nt1, pTouch)
而写:
__lfetch_excl(__lfhint_nt1, pTouch)
这(读取与写入预取)似乎很好地匹配了 powerpc 语义(除了 ia64 允许临时提示)。
有点奇怪的是,有问题的 ia32/amd64 代码正在使用
prefetchnta
不是
prefetchnt1
就像该代码与 ia64 实现一致(我们的(仍然活动的)hpipf 端口和我们现在死掉的 windows 和 linux ia64 端口的代码中的 #ifdef 变体)。
由于我们正在使用 intel 编译器进行构建,因此通过切换到 xmmintrin.h 内置程序,我应该能够使我们的许多 ia32/amd64 平台保持一致:
_mm_prefetch( (char *)pTouch, _MM_HINT_NTA )
_mm_prefetch( (char *)pTouch, _MM_HINT_T1 )
...只要我能弄清楚应该使用什么时间提示。
问题:
是否有读取与写入 ia32/amd64 预取指令?我在指令集参考中没有看到任何内容。
nt1、nt2、nta 时间变化中的一个是否更适合读取与写入预取?
知道是否有充分的理由在 ia32/amd64 上使用 NTA 时间提示,而在 ia64 上使用 T1?