任何人都可以给出一个示例或链接到一个__builtin_prefetch在GCC 中使用的示例(或者通常只是asm指令prefetcht0)以获得实质性的性能优势吗?特别是,我希望这个例子符合以下标准:
__builtin_prefetch指令会导致性能下降.__builtin_prefetch用相应的内存访问替换指令会导致性能下降.也就是说,我想要最简短的示例,显示__builtin_prefetch执行无需管理就无法管理的优化.
在6.3.2中,这篇优秀论文 Ulrich Drepper撰写了关于软件预取的文章.他说这是"熟悉的指针追逐框架",我收集的是他之前给出的关于遍历随机指针的测试.在他的图表中,当工作集超过缓存大小时,性能会逐渐消失,因为那时我们会越来越频繁地访问主内存.
但是为什么prefetch只能帮助8%呢?如果我们告诉处理器我们想要加载什么,并且我们提前告诉它足够远(他提前160个循环),为什么缓存不满足每个访问?他没有提到他的节点大小,所以当只需要一些数据时,由于获取一个完整的行可能会有一些浪费?

我试图使用_mm_prefetch与树,我看到没有明显的加速.我正在做这样的事情:
_mm_prefetch((const char *)pNode->m_pLeft, _MM_HINT_T0);
// do some work
traverse(pNode->m_pLeft);
traverse(pNode->m_pRight)
Run Code Online (Sandbox Code Playgroud)
现在这应该只能帮助一方进行遍历,但我只看到性能上没有任何变化.我确实将/ arch:SSE添加到项目设置中.我正在使用带有i7 4770的Visual Studio 2012.在这个帖子中,一些人还谈到了使用预取只获得1%的加速.为什么预取不会对主内存中的数据随机访问产生影响?