我知道不建议在 CUDA 中进行分支,因为它会对性能产生不利影响。在我的工作中,我发现自己必须实现包含几十个案例的大型 switch 语句。
有谁知道这会对性能造成多么严重的影响。(官方文档不是很具体)还有没有人有更有效的方式来处理这部分?
我知道不建议在 CUDA 中进行分支,因为它会对性能产生不利影响。在我的工作中,我发现自己必须实现包含几十个案例的大型 switch 语句。
有谁知道这会对性能造成多么严重的影响。(官方文档不是很具体)还有没有人有更有效的方式来处理这部分?
GPU 以 32 个为一组运行线程,称为 warp。每当一个 warp 中的不同线程通过代码中的不同路径时,GPU 必须多次运行整个 warp,每个代码路径一次。
要处理这个称为warp 分歧的问题,您需要安排线程,以便给定warp 中的线程通过尽可能少的不同代码路径。当你这样做了,你几乎只需要咬紧牙关,接受任何剩余的经线分歧造成的性能损失。在某些情况下,您可能无法安排线程。如果是这样,并且如果不同的代码路径是内核或整体工作负载的重要组成部分,那么该任务可能不适合 GPU。
如何实现不同的代码路径并不重要。if-else
, switch
, 谓词(在 PTX 或 SASS 中)、分支表或其他任何东西——如果它归结为在不同路径中运行的经纱中的线程,你会受到性能的影响。
每条路径有多少线程通过也无关紧要,只是经线中不同路径的总数。
这是另一个更详细的答案。
避免多次切换的一个好方法是实现函数表并根据您的切换条件按索引从表中选择函数。__device__
CUDA 允许您在内核中的函数上使用函数指针。