我有一个问题,似乎可以通过枚举所有可能的解决方案然后找到最佳解决方案来解决。为此,我设计了一种回溯算法,可以枚举并存储找到的最佳解决方案。到目前为止效果很好。

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

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

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

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

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

有帮助吗?

解决方案

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

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

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

其他提示

我认为伊恩在这里有正确的想法。最佳性能将来自最少的内存转移和分支。写入全局内存和检查标志(分支)与 CUDA最佳实践指南 并会减少您的加速。

您可能想查看回调。主CPU线程可以确保所有线程以正确的顺序运行。 CPU回调线程(读:后处理)可以执行其他开销,并调用相关的API功能以及处理所有子线程数据...此功能在CUDA样本中找到并在CUDA功能上编译2.希望这对您有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top