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