如何确定CUDA流阻塞的原因

我试图将我从Tesla T10处理器(计算能力1.3)写入的算法转换为Tesla M2075(计算能力2.0)。 切换时,我惊讶地发现我的算法减慢了。 我分析了它,发现它似乎是因为在新机器上cuda流被阻塞。 我的算法有3个主要任务可以拆分并行运行:内存重组(可以在CPU上完成),从主机到设备的内存复制以及设备上的内核执行。 在旧机器上拆分流允许3个任务像这样重叠(来自NVidia Visual Profiler的所有屏幕截图): 正确的流执行

但是,在新计算机上,在启动CPU计算之前,流将阻塞,直到前一个内核完成执行,如下所示: 3流执行

你可以看到最上面一行,所有的橙色块都是cudaStreamSynchronize调用,直到前一个内核完成执行为止,即使该内核位于完全不同的流上。 它似乎适用于通过流的第一次运行并正确并行化,但在此之后问题开始了,所以我认为它可能阻止了某些内容,并且尝试增加给出此结果的流的数量: 12流执行

在这里你可以看到,由于某种原因,只有前4个流被阻塞,然后才开始正确并行化。 作为最后一次尝试,我试图通过仅使用前4个流一次,然后切换到使用后来的流,但仍然不起作用,它仍然停滞每4个流,同时让其他流同时执行: 10个流执行

所以我正在寻找什么可能导致这个问题以及如何诊断它的任何想法。 我对我的代码感到厌倦,我不认为这是一个错误,尽管我可能会误解。 每个流都封装在自己的类中,只有一个参考cudaStream_t,它是该类的成员,所以我不明白它是如何引用另一个流并对其进行阻塞的。

对于我不知道的版本1.3和2.0之间的流式传输方式,是否有所改变? 它可能是共享内存没有被释放,它不得不等待? 欢迎任何有关如何诊断此问题的想法,谢谢。


我不能完全确定没有看到代码,但看起来你可能在排列命令的顺序时遇到问题。 计算能力1.x和2.x设备处理数据流的方式略有不同,因为2.x设备可以同时运行多个内核并同时处理HtoD和DtoH。

如果你按照所有HtoDs的顺序排列你的命令,所有的计算,所有的DtoHs你都会在特斯拉卡上获得好的结果(1060等)。

如果你命令他们复制HtoD,计算,复制DtoH,复制HtoD等等,你将在费米有很好的结果。

开普勒在这两种情况下都做得很好。 在特斯拉和费米两种情况下,这对跨越各个流都很重要,我建议阅读NVIDIA的这篇文章以获取更多信息。 重叠在溪流可以是一个非常复杂的问题,我希望你很好。 如果您需要进一步的帮助,您排队操作顺序的一般表示将非常有用。

链接地址: http://www.djcxy.com/p/14059.html

上一篇: How to determine why a CUDA stream is blocking

下一篇: Is the default area for Html.BeginForm always the current area in ASP.NET MVC?