当CUDA内核包含这样的条件代码时:
if (statement1)
calculation1;
else if (statement2)
calculation2;
else if (statement3)
calculation3;
是否意味着计算将被序列化?
答案 0 :(得分:7)
只要在单个线程扭曲中存在不同的分支,就会发生CUDA中的执行序列化。因此,在您的抽象示例中,如果三个语句中的任何一个对于任何给定的 warp 都没有评估为相同,则会出现三个计算代码块的某些组合的分支差异和指令重放,从而产生序列化用于该warp 。但如果条件在warp级别评估为相同,那么就没有序列化。
你还应该记住在CUDA中有条件执行,所以如果你有这样的事情:
if (statement1)
calculation1;
end if
即使warp中的所有线程都不为statement1
,也不会有任何序列化,而warp中的某些线程只执行NOOP
的等效。
所以对你的问题没有一般的答案 - 取决于代码的结构,决定条件的输入数据,以及warp之间条件评估的分组,可能有也可能没有序列化。通常,体系结构和编译器比许多人想象的更容忍分支,并且包含分支和条件的合理编写代码将仅支付很小(甚至可忽略的)性能损失。 CUDA分析器提供了大量有关序列化和指令重放的信息 - 这应该是了解分支对给定代码片段性能的影响的主要指南。