CUDA:停止所有其他线程

时间:2010-09-17 13:38:26

标签: cuda backtracking

通过列举所有可能的解决方案然后找到最佳解决方案,我有一个看似可以解决的问题。为了做到这一点,我设计了一个回溯算法,如果找到,它会枚举并存储最佳解决方案。它到目前为止工作正常。

现在,我想将此算法移植到CUDA。因此,我创建了一个生成一些不同基本案例的过程。这些基本情况应该在GPU上并行处理。如果其中一个CUDA线程找到了最佳解决方案,那么所有其他线程当然可以停止它们的工作。

所以,我想要以下内容:找到最佳解决方案的线程应该停止所有运行程序的CUDA线程,从而完成计算。

经过一些快速搜索后,我发现线程只能在同一个块中进行通信。 (所以我认为不可能阻止其他人阻止线程。)

我能想到的唯一方法是我有一个专用标志optimum_found,它在每个内核的开头检查。如果找到最佳解决方案,则此标志设置为1,因此所有未来的线程都知道它们不必工作。但是,当然,如果在每次迭代时都没有检查它,那么已经运行的线程就不会注意到这个标志。

那么,是否有可能停止所有剩余的CUDA线程?

3 个答案:

答案 0 :(得分:5)

我认为只要它是全局内存中的内存位置,您拥有专用标志的方法就可以工作。这样你就可以在每次内核调用开始时检查这个。

内核调用通常应该相对较短,因此即使其中一个线程找到最佳解决方案也不会影响您的性能,因此让其他线程完成批处理。

那就是说,我很确定没有可以杀死其他正在执行的线程的CUDA调用。

答案 1 :(得分:1)

我认为Ian在这里有正确的想法。最佳性能来自最小内存传输和分支。写入全局内存和检查标志(分支)违反了 CUDA最佳实践指南,这将降低您的加速。

答案 2 :(得分:0)

您可能希望查看回调。主CPU线程可以确保所有线程以正确的顺序运行。 CPU回调线程(读取:后处理)可以执行额外的开销并调用相关的api函数以及处理所有子线程数据...此功能可在cuda示例中找到并编译cuda功能2.希望这会有所帮助。