为什么__builtin_prefetch在这里没有任何影响?

qdi*_*dii 7 c++ optimization performance gcc

我正在编写一个解析文件的程序.它由一个主循环组成,逐个字符地解析并处理它们.这是主循环:

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   
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我添加了一条builtin_prefetch指令,希望在我的循环的下一次迭代中放入缓存.我试着用不同的值:ptr+i+1,ptr+i+2,ptr+i+10但似乎没有任何改变.

为了测量性能,我使用valgrind的工具cachegrind,它给出了缓存未命中数的指示.在线上c = *ptr,cachegrind在__builtin_prefetch未设置时记录632,378 DLmr(L3缓存未命中).但奇怪的是,无论我设置的参数如何,这个值都不会改变__builtin_prefetch.

对此有何解释?

Mys*_*ial 11

那是因为硬件比你早多年.:)

有一些硬件预取器可以识别简单的模式并为您进行预取.在这种情况下,您有一个简单的顺序访问模式,这对于硬件预取器来说是微不足道的.

只有当硬件无法预测的访问模式时,手动预取才会派上用场.

这是一个这样的例子:预取示例?

  • GCC实际上删除了你输入的预取?我印象深刻! (4认同)