CUDA以及if和else if

时间:2012-03-22 12:58:31

标签: c cuda

当CUDA内核包含这样的条件代码时:

if (statement1)
  calculation1;

else if (statement2)
  calculation2;

else if (statement3)
  calculation3;

是否意味着计算将被序列化?

1 个答案:

答案 0 :(得分:7)

只要在单个线程扭曲中存在不同的分支,就会发生CUDA中的执行序列化。因此,在您的抽象示例中,如果三个语句中的任何一个对于任何给定的 warp 都没有评估为相同,则会出现三个计算代码块的某些组合的分支差异和指令重放,从而产生序列化用于该warp 。但如果条件在warp级别评估为相同,那么就没有序列化。

你还应该记住在CUDA中有条件执行,所以如果你有这样的事情:

if (statement1) 
  calculation1; 
end if

即使warp中的所有线程都不为statement1,也不会有任何序列化,而warp中的某些线程只执行NOOP的等效。

所以对你的问题没有一般的答案 - 取决于代码的结构,决定条件的输入数据,以及warp之间条件评估的分组,可能有也可能没有序列化。通常,体系结构和编译器比许多人想象的更容忍分支,并且包含分支和条件的合理编写代码将仅支付很小(甚至可忽略的)性能损失。 CUDA分析器提供了大量有关序列化和指令重放的信息 - 这应该是了解分支对给定代码片段性能的影响的主要指南。