减少指令高速缓存未命中(在C ++中)

时间:2012-11-01 03:48:51

标签: c++ localityofreference

假设我有一个C ++类,其实现看起来像这样:

// ...

MyClass::iterativeFunction() {
     for (int i = 0; i < 1000000; i++) {
          performAction(i);
     }
}

MyClass::performAction(int index) {
     // Block of code (non-inline-able)
}

// ...

在C ++级别,我是否可以控制这些方法的空间局部性,或者我是否只是希望编译器会注意到相关方法并相应地优化其程序集?理想情况下,我希望它们彼此相邻,因此它们将一起加载到指令缓存中,但我不知道如何让编译器知道我真的希望这种情况发生。

4 个答案:

答案 0 :(得分:5)

在任何一种情况下,代码在进入缓存之前都无法运行。在任何一种情况下,对于代码流所在的CPU来说同样明显,因为流是无条件的。所以它不会有任何区别。现代代码缓存不会在地址空间中提取,它会在指令流中提前,在无条件分支之后,并根据需要预测条件分支。

所以没有理由关心这个。它没有任何区别。

答案 1 :(得分:2)

从技术上讲,没有。但是,在现代处理器上,你通常不需要担心指令缓存几乎和数据缓存一样多,除非你有一个非常大的可执行文件或者到处都是非常可怕的分支。 / p>

原因是缓存行只有大约64个字节长,这意味着如果你的方法大于64个字节(并且它们是),则需要将它们加载到多个缓存条目中,即使它们是直接下一个物理记忆中的彼此。

答案 2 :(得分:1)

如果您需要这种级别的控制和优化,那么C ++对您来说就是错误的语言。

但你问题的实际答案是“不”。

答案 3 :(得分:0)

不,据我所知,您无法指定方法的位置。 如果C ++允许嵌套过程,这将是确保被调用过程是本地的一种方法。