Cuda 独立内核不并发执行

Cuda 独立内核不并发执行,cuda,Cuda,我正在CUDA中实现一个类似Radon的转换,但我似乎无法从GeForce TITAN中获得所有性能(编辑:显然是这样,请参见注释)。为了优化这一点,我考虑了并发执行内核,因为它们只需要最少的数据传输,但我无法让内核同时执行 典型的配置文件运行如下所示: 这是在启用“并发内核支持”的情况下,使用CUDA5.5(RC)编译和生成sm_35的代码。重叠是最小的,几乎不值得 我已经阅读了一些关于并发内核执行的内容,并尝试了不同的方法来实现它: 在不同的流中启动内核 交错内核启动,例如,首先使用n个

我正在CUDA中实现一个类似Radon的转换,但我似乎无法从GeForce TITAN中获得所有性能(编辑:显然是这样,请参见注释)。为了优化这一点,我考虑了并发执行内核,因为它们只需要最少的数据传输,但我无法让内核同时执行

典型的配置文件运行如下所示:

这是在启用“并发内核支持”的情况下,使用CUDA5.5(RC)编译和生成sm_35的代码。重叠是最小的,几乎不值得

我已经阅读了一些关于并发内核执行的内容,并尝试了不同的方法来实现它:

  • 在不同的流中启动内核
  • 交错内核启动,例如,首先使用n个流启动内核A n次,然后使用相同的n个流启动内核B n次,等等(尽管开普勒可能不再需要这样做;即使在非交错启动时,硬件也会设法部分重叠内核)
  • 确保内核不使用相同的全局内存(尽管我不知道这是否重要)
  • 确保内核不使用太多共享内存(旋转内核不使用任何共享内存)
我不明白为什么旋转内核没有更多的重叠。我的资源有限吗?如果是,我如何才能发现这一点?如果我使用更多样化的内核,它会设法并行化更多一些,例如在这个内核中

但我认为它应该做得更好


编辑:删除了20%的数字,因为我无法复制它,而且它似乎也是错误的

您引用的哪个Nsight utilization指标表明SM使用率为20%?高亮显示的rotate_内核启动725*((725+WARP_SIZE-1)/WARP_SIZE)=725*23=16675扭曲,这将完全填充GPU 16675扭曲/46扭曲/SM/14 SM=~26次。这个内核不太可能有20%的SM利用率。您能否提供有关VisualProfiler指标和内核的更多信息。考虑到您提供的数据,您的图表符合我的期望。当您说“NSight仅报告20%的短信正在使用”时,您到底在谈论什么统计数据?泰坦有14个SM,它不能被5整除,那么你怎么计算出20%?无论如何查看其中一幅图像中的网格和块配置-块大小[1725,1]看起来很奇怪,为什么要将x维度设置为1?暂时忽略这一点,每个块使用725个线程将允许您在每个SM中同时运行2个块,并且您希望启动一个包含725个块的网格。我看到Greg也已经做了计算。。。我同意他的观点,考虑到网格和块的配置,时间线在我看来就像我期望的那样;我无法复制20%的指标,抱歉误传。这意味着我的资源有限,添加流也无济于事,对吗?@RoBiK:我使用1x725x1线程块大小,因为它与算法后续部分的工作方式相匹配,它计算行上的数据,所以我使用线程将行中的所有像素分组。这会影响表演吗?