【发布时间】:2013-01-05 13:06:51
【问题描述】:
我曾尝试将内核执行与 memcpyasync 重叠,但它不起作用。我遵循编程指南中的所有建议,使用固定内存、不同的流等。我看到内核执行确实重叠,但它与内存传输无关。我知道我的卡只有一个复制引擎和一个执行引擎,但是执行和传输应该重叠,对吧?
似乎“复制引擎”和“执行引擎”总是执行我调用函数的顺序。工作包括执行 [HtoD x2, Kernel, DtoH] 的 4 个流。如果我在每个流上发出 HtoDx2,Kernel,DtoH 系列,我会在分析器中看到 stream2 HtoD 第一个操作在第一个 DtoH 操作结束之前不会开始。如果我首先在每个流上发布 HtoD,然后是第二个 HtoD,然后是内核,然后是 DtoH(宽度),我看不到重叠,并且发布顺序也由 GPU 强制执行。
我已尝试使用 CUDA SDK 中给出的 simpleStreams 示例,我也看到了相同的行为。
我附上了一些屏幕截图,显示了 VS2008 的视觉分析器和 Nsight 中的问题。
ps。我没有设置 CUDA_LAUNCH_BLOCKING 环境
简单的流视觉分析器
MyApp Nsight 时间线广度优先
MyApp Nsight 时间线深度优先
编辑:
添加额外的 x4 内核(总共 2HtoD,5 个内核,每个流 1DtoH)--> 如果我在使用和不使用 --concurrent-kernels-off 的情况下运行 nvprof,则经过的时间是相同的。如果我设置 env CUDA_LAUNCH_BLOCKING=1,那么我会看到(从命令行)7.5% 的性能提升!
系统规格:
- Windows 7
- 第一个 PCI-E 插槽中的 NVIDIA 6800 VGA
- 第二个 PCI-E 插槽中的 GTX480
- NVIDIA 驱动程序:306.94
- 视觉工作室 2008
- CUDA v5.0
- 视觉分析器 5.0
- Nsight 3.0
【问题讨论】:
-
在深度优先示例中,可能存在并发,因为 GTX480 只有一个复制引擎,因此不可能重叠。在广度优先示例中,HtoD 与内核以及内核与 DtoH 之间存在重叠的可能性。对于 Nsight VSE,您可能需要确保未启用序列化跟踪。请检查 Nsight|Options...|Analysis|CUDA Kernel Trace Mode 下的选项。如果您发布可重现的内容,我可以帮助您确定问题。
-
已编辑:深入第一个示例,当来自第一个流的 memcpy 结束并(部分)与内核执行(等等)重叠时,我希望来自第二个流的 memcpy 开始。
-
btw 内核跟踪模式是并发的(感谢您指出)
-
请提供重现问题的具体源代码。
-
@Dredok:注册后,登录并发布您的票证here。
标签: concurrency cuda overlapping nsight