我目前正在使用 CUDA 5.0 中引入的新 CUDA 动态并行 (CDP) 功能。我选择了N-queens 谜题作为具有高度工作不平衡的树搜索算法的示例,在我看来,这可能会从 CDP 中受益。
我的方法大致如下:对于给定的棋盘配置(在第一行中已经放置了一定数量皇后的棋盘),我启动一个带有多个线程的内核。每个线程尝试给定配置下的子树的一个可能分支,直到给定最大值。深度。如果分支的离开仍然代表一个有效的配置,那么该线程会产生一个子线程网格,用于搜索基于该配置的子树。发现其配置无效的线程(两个或更多皇后可能互相攻击)将终止。如果一个线程成功地将最后一个皇后放在板上,它会增加解决方案计数器。
在启动内核之前,我预先计算了 CPU 上的一些板配置,然后为每个配置启动一个网格。
现在解决问题:我发现我的解决方案比另一个不使用 CDP 的 CUDA 实现要慢得多。所以我启动了 Nsight profiler 来寻找原因。这是我的第一个结果(对于 N=10):
显然GPU没有被完全占用。所以我想我需要使用不同的流来启动子网格,以防止它们相互等待。以下是为每个子网格启动使用新流时的分析结果:
这看起来更密集(并且更快),但我仍然不太明白这种模式的原因。为什么在一些发布之间(尤其是最后)会有这么多的闲聊?
但它变得更加陌生。当我将 N(以及工作负载)增加到 13 时,模式如下所示:
有人知道 CDP 在内部是如何工作的吗?有没有我还没有考虑到的隐式同步障碍?还是我读错了探查器输出?我特别好奇在最后一种情况下这个跨越几乎整个执行时间的线程可能是什么。
我也没有找到关于 Nsight Visual Profiler 的任何关于 CDP 输出的文档。关于 Nsight 在那里展示的任何好的参考资料也会有所帮助。
谢谢!