处理CUDA中的大型switch语句

时间:2012-06-25 08:21:31

标签: parallel-processing cuda switch-statement statements

我知道不建议在CUDA中进行分支,因为它会对性能产生负面影响。在我的工作中,我发现自己必须实现包含几十个案例的大型switch语句。

有没有人知道这会对性能造成多大影响。 (官方文档不是很具体)也有人有更有效的方法来处理这部分吗?

2 个答案:

答案 0 :(得分:5)

GPU以32个为一组运行线程,称为warp。每当warp中的不同线程经过代码中的不同路径时,GPU必须多次运行整个warp,每个代码路径运行一次。

要处理这个称为warp divergence的问题,你需要安排你的线程,以便给定warp中的线程尽可能少地通过不同的代码路径。当你这样做的时候,你几乎必须咬紧牙关并接受因任何剩余的扭曲发散而导致的性能损失。在某些情况下,您可能无法执行任何操作来排列线程。如果是这样,并且如果不同的代码路径是内核或整体工作负载的重要部分,则该任务可能不适合GPU。

如何实现不同的代码路径无关紧要。 if-elseswitch,预测(在PTX或SASS中),分支表或其他任何东西 - 如果它归结为在不同路径中运行的warp中的线程,则会受到性能的影响。< / p>

每条路径的线程数也无关紧要,只是经线中不同路径的总数。

这里有another answer更详细的内容。

答案 1 :(得分:1)

避免多个切换的一个好方法是在切换条件下实现功能表并从表中逐个选择功能。 CUDA允许您在内核中的__device__函数上使用函数指针。