The 'select' instruction is used to choose one value based on a condition, without branching.
我想知道分支指令和选择指令之间的区别(最好是 x86 架构和 PTX)。据我所知,select
与分支指令相比,它更优化,但我没有清晰的画面。
The 'select' instruction is used to choose one value based on a condition, without branching.
我想知道分支指令和选择指令之间的区别(最好是 x86 架构和 PTX)。据我所知,select
与分支指令相比,它更优化,但我没有清晰的画面。
分支是一种用于重定向控制流的通用机制。它用于实现大多数形式的if
语句(当特定优化不适用时)。
选择是某些指令集上可用的专用指令,可以实现某些形式的条件表达式
z = (cond) ? x : y;
或者
if(cond) z = x;
前提是x
和y
是普通值(如果它们是表达式,它们都必须在选择之前计算,这可能会导致性能损失或不正确的副作用评估)。这样的指令必然比分支更受限制,但具有指令指针不变的明显优势。因此,处理器不需要在分支错误预测时刷新其流水线(因为没有分支)。因此,选择指令(如果可用)更快。
在一些超标量架构上,例如 CUDA,分支在性能方面非常昂贵,因为并行单元必须保持完全同步。例如,在 CUDA 上,块中的每个执行单元都必须采用相同的执行路径;如果一个线程分支,那么每个单元都会通过两个分支(但将对未采取的分支执行无操作)。但是,选择指令不会产生这种惩罚。
请注意,大多数编译器将使用合适的选项生成“选择”样式的指令,就像cmov
给出一个足够简单的if
语句一样。此外,在某些情况下,可以使用按位操作或逻辑运算将布尔条件与表达式值组合,而无需执行分支。