【问题标题】:CUDA: Stop all other threadsCUDA:停止所有其他线程
【发布时间】:2010-09-17 13:38:26
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: cuda backtracking


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2015-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-20
          相关资源
          最近更新 更多