相关疑难解决方法(0)

为什么英特尔这些年来改变了静态分支预测机制?

这里我知道英特尔近年来实施了几种静态分支预测机制:

  • 80486年龄:永远不被采取

  • Pentium4年龄:未采取后退/前锋

  • 像Ivy Bridge,Haswell这样的新型CPU变得越来越无形,请参阅Matt G的实验.

英特尔似乎不想再谈论它,因为我在英特尔文档中找到的最新资料大约是十年前写的.

我知道静态分支预测(远远不是)比动态更重要,但在很多情况下,CPU将完全丢失,程序员(使用编译器)通常是最好的指南.当然,这些情况通常不是性能瓶颈,因为一旦频繁执行分支,动态预测器就会捕获它.

由于英特尔不再在其文档中明确声明动态预测机制,因此GCC的builtin_expect()只能从热路径中删除不太可能的分支.

我不熟悉CPU的设计,我不知道究竟是什么机制,目前英特尔使用其静态预测,但我还是觉得英特尔的最佳机制应该清楚地记录他的CPU",我打算去当动态预测失败,向前或向后',因为通常程序员是当时最好的指南.

更新:
我发现你提到的主题逐渐超出我的知识范围.这里涉及一些动态预测机制和CPU内部细节,我在两三天内无法学习.所以请允许我暂时退出你的讨论并充电.
这里仍然欢迎任何答案,也许会帮助更多人

compiler-construction x86 intel cpu-architecture branch-prediction

9
推荐指数
3
解决办法
1637
查看次数

优化稀疏下三角线性系统的反向求解

我有 nxn 下三角矩阵 A 的压缩稀疏列 (csc) 表示,主对角线上有零,并且想求解 b

(A + I)' * x = b
Run Code Online (Sandbox Code Playgroud)

这是我计算这个的例程:

void backsolve(const int*__restrict__ Lp,
               const int*__restrict__ Li,
               const double*__restrict__ Lx,
               const int n,
               double*__restrict__ x) {
  for (int i=n-1; i>=0; --i) {
      for (int j=Lp[i]; j<Lp[i+1]; ++j) {
          x[i] -= Lx[j] * x[Li[j]];
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,b通过参数传入x,并被解决方案覆盖。Lp, Li,Lx分别是稀疏矩阵标准 csc 表示中的行、索引和数据指针。这个函数是程序中的顶级热点,用行

x[i] -= Lx[j] * x[Li[j]];
Run Code Online (Sandbox Code Playgroud)

花费的大部分时间。编译gcc-8.3 -O3 -mfma -mavx -mavx512f给出

backsolve(int const*, int …
Run Code Online (Sandbox Code Playgroud)

c c++ optimization performance assembly

8
推荐指数
1
解决办法
236
查看次数