【问题标题】:Difference between branching and select instructions分支指令和选择指令的区别
【发布时间】:2012-09-27 00:24:03
【问题描述】:

The 'select' instruction is used to choose one value based on a condition, without branching.

我想知道分支指令和选择指令之间的区别(最好适用于 x86 架构和 PTX)。据我所知,select 与分支指令相比更优化,但我没有清晰的画面。

【问题讨论】:

  • 我已经编辑了问题,谢谢
  • x86 没有我知道的一般选择指令。你在想cmov吗?
  • 恐怕我对 ISA 的了解非常有限,但我指的是一种无需分支即可解析条件的指令。这有意义吗?

标签: compiler-optimization computer-architecture instruction-set


【解决方案1】:

分支是一种用于重定向控制流的通用机制。它用于实现大多数形式的if 语句(不适用特定优化时)。

选择是某些指令集上可用的专用指令,可以实现某些形式的条件表达式

z = (cond) ? x : y;

if(cond) z = x;

假设xy 是普通值(如果它们是表达式,则它们都必须在选择之前计算,这可能会导致性能损失或不正确的副作用评估)。这样的指令必然比分支更受限制,但具有指令指针不变的明显优势。因此,处理器不需要在分支错误预测时刷新其流水线(因为没有分支)。因此,选择指令(如果可用)更快。

在一些超标量架构上,例如CUDA,分支在性能方面非常昂贵,因为并行单元必须保持完全同步。例如,在 CUDA 上,块中的每个执行单元都必须采用相同的执行路径;如果一个线程分支,那么每个单元都会通过两个分支(但将对未采取的分支执行无操作)。但是,选择指令不会产生这种惩罚。

请注意,如果给定一个足够简单的if 语句,大多数编译器将使用合适的选项生成“选择”式指令,如cmov。此外,在某些情况下,可以使用按位操作或逻辑运算将布尔条件与表达式值组合在一起,而无需执行分支。

【讨论】:

  • 谢谢。因此,select 适用于单个(或可能达到有限数量)条件,例如 z = (cond) ? x : y;;然而,如果条件后面有多个语句(如if (cond) {...10 lines...} else {...10 lines...}),是否会跳转到内存的另一部分?然后,还有像r = y ^ ((x ^ y) & -(x < y)); // min(x, y) - (graphics.stanford.edu/~seander/bithacks.html#IntegerAbs) 这样的按位操作(可能是特定于编译器)的情况。我说的对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2021-07-06
  • 2019-04-15
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多