【发布时间】:2014-02-09 19:02:18
【问题描述】:
我几年前写了一个项目,在单个 CPU 内核上连续计算 N 个类似的任务。
这 N 个任务是完全独立的,因此可以并行计算。
但是,这些任务的问题在于,每个任务内部的控制流因一个任务而异,因此在 CUDA 中实施的 SIMT 方法更有可能是阻碍而不是帮助。
我想出了一个想法,启动 N 个块,每个块有 1 个线程,以打破线程的扭曲依赖性。
任何人都可以提出一种更好的方法来优化这种情况下的计算,或者指出我的解决方案可能存在的缺陷。
【问题讨论】:
-
我相信如果没有进一步的细节就无法回答这个问题。您可能知道,只有当一个 warp 中的所有线程不遵循通过分支的相同路径时,分支才会有问题。所以,我想说:尽量组织你的任务,让所有具有相同控制流的人在统计上都遵循相同的路径,如果可能的话。
-
我认为如果至少一个线程遵循与其他线程不同的路径,则分支是有问题的,因为它们都必须等待这个特定线程才能从下一个公共命令继续执行。在最坏的情况下,单个 warp 中的 32 个线程将彼此等待并连续执行,这意味着 32 倍的速度减慢。我错了吗?
-
你是对的。请注意,我上面的评论与您自己的评论并不矛盾。我只是说:组织你的任务以最大化扭曲通过分支遵循相同路径的概率。在没有任何进一步的信息的情况下,我无法说得更好。我可以建议的另一件事是,如果可能的话,通过避免控制流来完全重新定义您的问题(可能忽略您的遗留软件)。最后,尝试更具体地改进您的问题,提及您面临的具体问题,发布示例或更好的瓶颈的小型复制器。
标签: multithreading cuda simd