【发布时间】:2015-06-16 16:09:50
【问题描述】:
我正在尝试了解指令缓存的工作原理。
在执行代码块时,预取了多少额外的缓存线?是否考虑了分支预测?
如果代码块包含函数调用,函数代码体是按顺序加载还是在缓存的不同部分加载?
例如,以下代码片段是否相同?
if (condition) {
// block of code that handles condition
}
和
if (condition) {
handle_condition(); // function that handles the condition
}
如果条件很少为真,哪一个会减少指令序列中的“漏洞”?
- 如果我的第一个示例是经常运行的代码的一部分,并且
if条件永远不会为真,那么if条件的主体是否最终会被驱逐,而代码主体的其余部分保持原样?
我假设这些问题没有取决于特定微架构的答案。但万一他们这样做了,我有一个 x86-64 Intel Sandy Bridge。
【问题讨论】:
-
现代分析编译器肯定会尝试将热路径打包在尽可能少的缓存块中。
-
我建议您阅读有关函数内联的内容。
-
@EOF - 我说的是函数没有内联的情况。
-
@BenVoigt - 在这种情况下,编译器不会知道该块是否是热路径的一部分,对吧?
-
您可以使用
gcc和clang扩展来标记unlikely等条件。查看此帖子:stackoverflow.com/questions/10922607/…
标签: c performance assembly cpu-cache micro-architecture