我有一个问题,似乎可以通过枚举所有可能的解决方案然后找到最佳解决方案来解决。为此,我设计了一种回溯算法,可以枚举并存储找到的最佳解决方案。到目前为止效果很好。
现在,我想将此算法移植到 CUDA 中。因此,我创建了一个生成一些不同的基本案例的过程。这些基本情况应该在 GPU 上并行处理。如果其中一个 CUDA 线程找到最佳解决方案,那么所有其他线程当然可以停止其工作。
所以,我想要以下内容:找到最佳解决方案的线程应该停止all运行我的程序的CUDA线程,从而完成计算。
经过一些快速搜索,我发现线程只有在同一个块中才能通信。 (所以我认为不可能阻止其他线程阻塞。)
我能想到的唯一方法就是我有一个专用的标志optimum_found
,在每个内核的开头都会进行检查。如果找到最佳解决方案,则该标志设置为1
,因此所有未来的线程都知道它们不必工作。但是,当然,如果已经运行的线程不在每次迭代时检查该标志,则它们不会注意到该标志。
那么,是否有可能停止所有剩余的 CUDA 线程?
我认为你拥有专用标志的方法可以工作,只要它是全局内存中的内存位置。这样您就可以在每次内核调用开始时检查这一点,正如您所说。
无论如何,内核调用通常应该相对较短,因此即使其中一个线程找到了最佳解决方案,让批处理中的其他线程完成也不会对性能产生太大影响。
也就是说,我相当确定没有 CUDA 调用可以杀死其他正在执行的线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)