c++ - 为什么 __builtin_prefetch 在这里没有任何作用?

标签 c++ performance optimization 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   
}

如您所见,我添加了一条 builtin_prefetch 指令,希望在我的循环的下一次迭代中放入缓存。我尝试了不同的值:ptr+i+1ptr+i+2ptr+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/

相关文章:

java - ejb bean 实例池 jboss EAP 6.1

ruby-on-rails - Ruby on Rails网站速度变慢

python - 全路径算法的优化

c++ - 在 QML 中显示 FPS

python - 模仿OpenCV中的 "magic wand"photoshop工具

c++ - 将函数地址转换为 UINTPTR_T 给出不正确的结果

optimization - 计算 Redis 中 index(zset) 之间关联了多少个元素

c++ - C++ 中的指针和 vector

java - Oracle和JDBC计算事务期间发生的执行次数及其性能

algorithm - 用于将组理想分配到可能溢出的容器中的有效算法?