2014-02-09 78 views
0

我有一个几年前编写的项目,它可以在单个CPU内核上计算N行相似的任务。执行高分支发散任务的最佳策略

这N个任务是完全独立的,所以它们可以并行计算。

但是,这些任务的问题在于每个任务内部的控制流程与其他任务之间存在很大差异,因此在CUDA中实施的SIMT方法将更有可能阻碍帮助。

我想出了一个想法,在每个线程中启动N个线程来打破线程的warp依赖关系。

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

+1

我相信不可能在没有更多细节的情况下回答这个问题。正如你可能知道的那样,当一个warp中的所有线程都不遵循通过一个分支的相同路径时,分支只是有问题的。所以,我会说:试着组织你的任务,使统计上所有具有相同控制流程的人都遵循相同的路径,如果可能的话。 – JackOLantern

+0

我认为如果至少一个线程遵循与其他线程不同的路径,则分支是有问题的,因为它们都必须等待这个特定的线程才能继续执行下一个常用命令。在最糟糕的情况下,单个warp中的32个线程将相互等待并连续执行,这意味着32x会减慢速度。我错了吗? – NAlexN

+1

你说得对。请注意,我上面的评论与您的​​评论并不矛盾。我只是说:组织你的任务,以最大化一个变形沿着通过分支的相同路径的可能性。没有任何进一步的信息,我不能说更好的。我可以建议的另一件事是,如果可能的话,通过避免控制流来彻底改写您的问题(可能忽略您的旧版软件)。最后,尝试改进您的问题,使其更具体,提及您重新面临的具体问题,发布一个示例或更好的小瓶颈复制器。 – JackOLantern

回答

2

你对你的评论是正确的,是什么原因造成的,以及由于变形中的线程分歧而引起的。但是,启动您提到的配置(每个块中有一个线程)会完全削弱GPU的潜力。变形/半变形中的线程是在单个多处理器上最终并行执行的最大线程单元。因此,在块中具有一个线程并具有32个这些块实际上是具有不同路径的经线中的32个线程。第一种情况甚至更糟,因为每个多处理器的数量驻留块数量非常有限(8或16,具体取决于计算能力)。因此,如果您想充分利用GPU的潜力,请记住Jack的评论并尝试重新组织线程,以便单个warp的线程遵循相同的执行路径。