我正在 CUDA 中实现类似 Radon 的变换,但我似乎无法从 GeForce TITAN 中获得所有性能(编辑:显然我这样做了,请参阅评论)。为了优化这一点,我考虑同时执行内核,因为它们只需要最少的数据传输,但我无法让内核同时执行。
典型的配置文件运行如下所示:
这是启用“并发内核支持”,使用 CUDA 5.5 (RC) 为 sm_35 编译和生成代码。重叠很小,几乎不值得。
我读过一些关于并发内核执行的文章,并尝试了不同的方法来让它正确:
- 在不同的流中启动内核
- 交错内核启动,例如首先使用 n 个流启动内核 A n 次,然后使用相同的 n 个流启动内核 B n 次,等等(尽管对于 Kepler 来说这可能不再需要;即使在启动时硬件也设法部分重叠内核非交错)
- 确保内核不使用相同的全局内存(尽管我不知道这是否重要)
- 确保内核不使用太多共享内存(旋转内核不使用任何内存)
我不明白为什么旋转内核不重叠更多。我的资源是否受到限制,如果是,我怎样才能找到它?如果我使用更多不同的内核,它会设法进行更多的并行化,例如在这个中,
但我认为它应该做得更好......
编辑:删除了 20% 的数字,因为我无法重现它,而且它似乎也是错误的