执行具有高分支分歧的任务的最佳策略[关闭]

Posted

技术标签:

【中文标题】执行具有高分支分歧的任务的最佳策略[关闭]【英文标题】:Best strategy to execute tasks with high branch divergency [closed] 【发布时间】:2014-02-09 19:02:18 【问题描述】:

我几年前写了一个项目,在单个 CPU 内核上连续计算 N 个类似的任务。

这 N 个任务是完全独立的,因此可以并行计算。

但是,这些任务的问题在于,每个任务内部的控制流因一个任务而异,因此在 CUDA 中实施的 SIMT 方法更有可能是阻碍而不是帮助。

我想出了一个想法,启动 N 个块,每个块有 1 个线程,以打破线程的扭曲依赖性。

任何人都可以提出一种更好的方法来优化这种情况下的计算,或者指出我的解决方案可能存在的缺陷。

【问题讨论】:

我相信如果没有进一步的细节就无法回答这个问题。您可能知道,只有当一个 warp 中的所有线程不遵循通过分支的相同路径时,分支才会有问题。所以,我想说:尽量组织你的任务,让所有具有相同控制流的人在统计上都遵循相同的路径,如果可能的话。 我认为如果至少一个线程遵循与其他线程不同的路径,则分支是有问题的,因为它们都必须等待这个特定线程才能从下一个公共命令继续执行。在最坏的情况下,单个 warp 中的 32 个线程将彼此等待并连续执行,这意味着 32 倍的速度减慢。我错了吗? 你是对的。请注意,我上面的评论与您自己的评论并不矛盾。我只是说:组织你的任务以最大化扭曲通过分支遵循相同路径的概率。在没有任何进一步的信息的情况下,我无法说得更好。我可以建议的另一件事是,如果可能的话,通过避免控制流来完全重新定义您的问题(可能忽略您的遗留软件)。最后,尝试更具体地改进您的问题,提及您面临的具体问题,发布示例或更好的瓶颈的小型复制器。 【参考方案1】:

您的评论是正确的,原因是什么导致了扭曲中的线程发散以及是什么导致的。但是,您提到的启动配置(每个块中 1 个线程)完全削弱了 GPU 的潜力。 warp/half-warp 中的线程是最终在单个多处理器上并行执行的最大线程单元。因此,在块中拥有一个线程并拥有 32 个这些块实际上就像在扭曲中拥有 32 个具有不同路径的线程。第一种情况更糟,因为每个多处理器的驻留块数量非常有限(8 或 16,取决于计算能力)。

因此,如果您想充分挖掘 GPU 的潜力,请记住 Jack 的评论并尝试重新组织线程,以便单个 warp 的线程遵循相同的执行路径。

【讨论】:

以上是关于执行具有高分支分歧的任务的最佳策略[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

分支策略[关闭]

分支策略 GIT [关闭]

AWS 任务角色策略的最佳实践

如何使用 TeamCity 和 Octopus 完成这种分支和部署策略

分支和合并策略

Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略