为什么在此示例中预取加速不会更大?

Phi*_*lip 5 sse intel visual-studio-2012

在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%的加速.为什么预取不会对主内存中的数据随机访问产生影响?

use*_*329 -1

您要预取的节点有多大?因为预取器不能超过 4K 页边界:如果你的节点更大,你只会预加载一部分数据,而剩余的数据只有在发生 miss 事件后才会加载。