1

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

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

4

1 回答 1

2

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

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

z = (cond) ? x : y;

或者

if(cond) z = x;

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

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

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

于 2012-09-27T00:51:54.440 回答