【问题标题】:Icache performance for the following code fragment以下代码片段的 Icache 性能
【发布时间】:2013-11-24 20:39:45
【问题描述】:

我有一个代码块

for ( ... ) 
{
    if (condition) {
       // some code
    }
    // some more code
}

if 条件内和外部的代码大小合适。条件要么总是真要么总是假,所以不应该有任何分支预测未命中。在条件始终为false 的情况下,if 条件内的代码是否会从指令缓存中删除?有什么方法可以针对 icache 进行优化吗?

【问题讨论】:

  • 在comile时间总是对还是错?从运行时开始?
  • IMO 这需要是关于单一类型处理器的问题 - 不同的处理器会表现不同,因此没有通用的答案。
  • 它针对 x86-64 处理器。

标签: performance caching optimization


【解决方案1】:

总的来说,我发现做这样的事情会更好:

if (condition) {
     for ( ... ) 
      {
      // some code
      }
}
else
{
     for (...)
     {
     // some more code
     }
}

如果if clause 确实是一个不变量

如果这种情况发生多次 - 您可以选择一个包含 for 循环的函数指针或函子,并在做出决定后调用它:

func = (condition) ? func1 : func2

然后到处打电话给func

【讨论】:

  • 函数指针将充当不可预知的分支 afaik。
  • @usr 在程序开始时设置,一旦状态建立,从那时起它就被调用——根本没有分支
  • 但是 CPU 无法预测执行的位置。有无数个可能的目标。不过,不确定这一点。
  • @usr 基本上和roll你自己的虚函数一样。是说没有预取,还是说这是一个分支未命中?
  • 我是说任何类型的间接调用都会使管道停顿,直到目标被计算出来。据我了解,这种停顿是间接跳转/调用的主要成本组成部分。正确预测的分支几乎没有延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多