Cuda 停止所有其他线程

Cuda 停止所有其他线程,cuda,backtracking,Cuda,Backtracking,我有一个问题,通过列举所有可能的解决方案,然后找到最好的,似乎是可以解决的。为了做到这一点,我设计了一种回溯算法,如果找到了最佳解决方案,它将枚举并存储。到目前为止效果还不错 现在,我想把这个算法移植到CUDA。因此,我创建了一个生成一些不同基本情况的过程。这些基本情况应在GPU上并行处理。如果其中一个CUDA线程找到了最佳解决方案,那么所有其他线程当然可以停止工作 所以,我想要的是:找到最佳解决方案的线程应该停止所有运行我程序的CUDA线程,从而完成计算 在快速搜索之后,我发现线程只有在同一块

我有一个问题,通过列举所有可能的解决方案,然后找到最好的,似乎是可以解决的。为了做到这一点,我设计了一种回溯算法,如果找到了最佳解决方案,它将枚举并存储。到目前为止效果还不错

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

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

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

我能想到的唯一方法是,我有一个专用的标志
optimum\u found
,它在每个内核的开头都会被检查。如果找到了最佳解决方案,该标志将设置为
1
,以便所有未来的线程都知道它们不必工作。但是,当然,已经运行的线程不会注意到这个标志,如果它们没有在每次迭代中检查它的话


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

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

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


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

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

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