我有一个似乎可以通过列举所有可能的解决方案然后找到最佳解决方案来解决的问题。为了做到这一点,我设计了一种回溯算法,它会枚举并存储找到的最佳解决方案。到目前为止它工作正常。
现在,我想将此算法移植到 CUDA。因此,我创建了一个程序来生成一些不同的基本案例。这些基本情况应该在 GPU 上并行处理。如果其中一个 CUDA 线程找到了最佳解决方案,那么所有其他线程当然可以停止它们的工作。
所以,我想要以下内容:找到最佳解决方案的线程应该停止我程序的所有正在运行的 CUDA 线程,从而完成计算。
经过一番快速搜索,我发现线程只有在同一个块中才能进行通信。(所以我想阻止其他人阻塞线程是不可能的。)
我能想到的唯一方法是我有一个专用标志optimum_found
,在每个内核开始时都会检查它。如果找到最佳解决方案,则将此标志设置为1
,因此所有未来的线程都知道它们不必工作。但是,当然,如果已经运行的线程没有在每次迭代时检查这个标志,它们就不会注意到这个标志。
那么,是否有可能停止所有剩余的 CUDA 线程?