我正在看一些稍微混淆的代码,它们试图使用各种编译器内置函数对预取指令进行平台抽象.它似乎最初基于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?
我能找到的有关 x86 预取提示类型的最佳资源是这篇好文章《每个程序员都应该了解内存》。
对于 x86 上的大部分来说,对于读取和写入预取没有不同的指令。例外似乎是那些非时间对齐的,其中写入可以绕过缓存,但据我所知,读取总是会被缓存。
很难回溯为什么早期的代码所有者在某种架构上使用一种提示而不是另一种。他们可能会假设该系列的处理器上有多少缓存可用、二进制文件的典型工作集大小、长期控制流模式等……并且不知道这些假设中有多少得到了良好的支持。推理或数据。从这里有限的背景来看,我认为您有理由采取对您现在正在开发的平台最有意义的方法,无论在其他平台上做了什么。当您考虑像这样的文章时尤其如此,这并不是我听说通过软件预取很难获得任何性能提升的唯一背景。
是否有更多预先知道的细节,例如使用此代码时的典型缓存未命中率,或者预计预取多少会有所帮助?
| 归档时间: | 
 | 
| 查看次数: | 970 次 | 
| 最近记录: |