【问题标题】:Why branch prediction is better in FP than INT为什么 FP 中的分支预测比 INT 更好
【发布时间】:2012-12-06 23:28:56
【问题描述】:

我在很多地方读过并且在很多图表中看到,分支预测对于浮点程序整数程序效果更好。为什么是这样?关于在哪里阅读它有什么建议吗?

谢谢!

【问题讨论】:

  • 我的直觉告诉我,浮点程序通常是数字的,控制流更简单,而整数程序更常见的是半数字或非数字,控制流更复杂。换句话说,不同的类型适用于不同的使用模式,这些模式或多或少受到分支预测机制的青睐。
  • 应该有很多论文注意到了这个事实。例如。 bwrc.eecs.berkeley.edu/classes/cs252/Projects/Reports/… 第 13-14 页 "浮点程序的条件分支百分比低于整数程序,但采用的条件分支百分比较高,如图 14 和图 15 所示。这是因为这些浮点程序有很多长循环结构。"
  • @osgx 你为什么不把它作为一个答案?

标签: performance optimization pipeline processor


【解决方案1】:

应该有很多论文注意到了这个事实。例如。 The Schemes and Performances of Dynamic Branch predictors第13-14页

浮点程序的条件分支百分比低于整数程序,但采用的条件分支百分比较高,如图 14 和图 15 所示。这是因为这些浮点程序具有许多长循环结构。

本文中还有一些关于 SpecInt 与 SpecFp 的统计数据——两组计算机基准程序——整数集和浮点集。有点过时,但仍然包含几个实际代码。

其他论文,例如this one 说,OOP(通常被认为是整数任务)是间接分支:

间接分支在面向对象语言中更为频繁。这些语言促进了一种更加多态的编程风格,其中子例程调用的后期绑定是干净、模块化代码设计的主要工具。虚函数表是大多数 C++ 和 Java 编译器选择的实现,它为每个多态调用执行一个间接分支。这里研究的 C++ 程序以 每 50 条指令 的频率执行一次间接分支;其他研究 [CGZ94] 也显示了类似的结果。 Java 程序(所有非静态调用都是虚拟的)可能使用间接 来电更频繁。

我认为,浮点程序通常是面向数组的:在每个数组的元素上执行几个通用代码循环。计算代数经常使用静态模式来访问邻近元素(例如,它只需要 [x-1][y] 和 [x-1][y-1] 来计算 [x][y])。

整数程序是关于具有大量指针的复杂数据结构。每个指针遍历都有一些条件代码(检查 NULL;条件 jmp 到下一次迭代);数据之间的依赖关系是复杂的或动态的。即使整数代码适用于巨大的 int 数组,例如图片,可能有条件代码用于在不足和溢出时饱和。数组的排序也有很多分支。

【讨论】:

  • 我认为正确的分割是控制逻辑 vs 数据处理,它更接近于标量 vs 向量而不是整数 vs 浮点数。碰巧的是,许多 FP 软件更接近于数据处理而不是控制逻辑。值得注意的是,有非常重分支的 FP 软件,例如依赖随机决策的路径追踪(光线追踪 3D 图形)和基于树的加速结构,这些都转化为难以预测的分支。相反,整数数据处理,例如图像处理,根本不是非常密集的分支。
猜你喜欢
  • 1970-01-01
  • 2014-05-08
  • 2018-01-20
  • 2019-06-30
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
相关资源
最近更新 更多