我正在编写一个程序来解析文件。它由一个逐个字符解析并处理它们的主循环组成。这是主循环:
char c;
char * ptr;
for( size_t i = 0; i < size ; ++i )
{
ptr = ( static_cast<char*>(sentenceMap) + i );
c = *ptr;
__builtin_prefetch( ptr + i + 1 );
// some treatment on ptr and c
}
如您所见,我添加了一条 builtin_prefetch
指令,希望在我的循环的下一次迭代中放入缓存。我尝试了不同的值:ptr+i+1
、ptr+i+2
、ptr+i+10
,但似乎没有任何变化。
为了衡量性能,我使用了 valgrind 的工具 cachegrind,它可以指示缓存未命中数。在 c = *ptr
行中,当未设置 __builtin_prefetch
时,cachegrind 记录了 632,378 DLmr(L3 缓存未命中)。奇怪的是,无论我将参数设置为 __builtin_prefetch
,这个值都不会改变。
有什么解释吗?
最佳答案
那是因为硬件比您领先很多年。 :)
有些硬件预取器旨在识别简单模式并为您进行预取。在这种情况下,您有一个简单的顺序访问模式,这对于硬件预取器来说非常重要。
只有当您具有硬件无法预测的访问模式时,手动预取才会派上用场。
这是一个这样的例子:Prefetching Examples?
关于c++ - 为什么 __builtin_prefetch 在这里没有任何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12488632/