cuda - 如何确定 CUDA 流阻塞的原因

标签 cuda gpu

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

然而,在新机器上,流在开始 CPU 计算之前阻塞,直到前一个内核执行完毕,如下所示:
3 stream execution

您可以看到顶行,所有橙色块都是 cudaStreamSynchronize 调用,它们会阻塞直到前一个内核完成执行,即使该内核位于完全不同的流上。它似乎适用于第一次通过流运行并正确并行化,但在那之后问题开始了,所以我想可能它阻塞了某些东西,我试图增加流的数量,这给了我这个结果:
12 stream execution

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

因此,我正在寻找有关可能导致此问题的原因以及如何诊断它的任何想法。我仔细研究了我的代码,我不认为这是一个错误,尽管我可能会误会。每个流都封装在它自己的类中,并且只有一个对单个 cudaStream_t 的引用,该 cudaStream_t 是该类的成员,因此我不知道它如何引用另一个流并对其进行阻塞。

流在 1.3 版和 2.0 版之间的工作方式是否有一些我不知道的变化?可能是共享内存没有被释放而不得不等待吗?欢迎任何有关如何诊断此问题的想法,谢谢。

最佳答案

如果没有看到代码,我无法完全确定,但看起来您的命令排队顺序可能有问题。由于 2.x 设备可以同时运行多个内核并同时处理 HtoD 和 DtoH,因此计算能力 1.x 和 2.x 设备处理流的方式略有不同。

如果您按照所有 HtoD、所有计算、所有 DtoH 的顺序排列命令,您将在 Tesla 卡上获得良好的结果(1060 等人)。

如果你命令他们复制 HtoD、计算、复制 DtoH、复制 HtoD……等等,你会在 Fermi 上得到很好的结果。

开普勒在这两种情况下都做得同样好。在 Tesla 和 Fermi 的情况下,这在整个流中都很重要,我建议阅读 this NVIDIA post想要查询更多的信息。跨流重叠可能是一个极其复杂的问题,祝你一切顺利。如果您需要进一步的帮助,将操作入队的一般顺序表示将非常有帮助。

关于cuda - 如何确定 CUDA 流阻塞的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16951371/

相关文章:

python - 运行 Numbapro CUDA 代码后计算机死机

c++ - 是否有任何带有执行器的在线编译器可以编译使用特定于 GPU 的 C/C++ 代码的应用程序?

cuda - GPU Gems 3 的并行前缀算法中使用的 CONFLICT_FREE_OFFSET 宏

pytorch - 切换 GPU 设备会影响 PyTorch 反向传播中的梯度吗?

python - 如何在pytorch中从gpu返回cpu?

c - CUDA 和 C 的 Makefile

c++ - OpenCV的Bayer转换使用什么算法?

3d - GPU:将浮点顶点坐标转换为定点。如何?

amazon-web-services - NVidia 驱动程序停止在使用 Ubuntu 16.04 和 Tesla K80 GPU 的 AWS EC2 实例上工作

c++ - 使用CUDA对两个数组求和