3

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

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

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

经过一番快速搜索,我发现线程只有在同一个块中才能进行通信。(所以我想阻止其他人阻塞线程是不可能的。)

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

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

4

3 回答 3

5

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

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

也就是说,我相当确定没有 CUDA 调用可以杀死其他积极执行的线程。

于 2010-09-17T18:20:52.493 回答
1

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

于 2010-09-20T02:22:30.900 回答
0

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

于 2015-04-04T17:24:56.860 回答