我尝试将内核执行与 memcpyasync 重叠,但它不起作用。我遵循编程指南中的所有建议,使用固定内存、不同的流等。我看到内核执行确实重叠,但与内存传输无关。我知道我的卡只有一个复制引擎和一个执行引擎,但是执行和传输应该重叠,对吧?
看来“复制引擎”和“执行引擎”总是强制执行我调用函数的顺序。工作包括执行 [HtoD x2、内核、DtoH] 的 4 个流。如果我在每个流上发出 HtoDx2,Kernel,DtoH 系列,我会在探查器中看到,在第一个 DtoH 操作结束之前,stream2 HtoD 第一个操作不会开始。如果我首先在每个流上发出 HtoD,然后是第二个 HtoD,然后是内核,然后是 DtoH(宽度),我看不到重叠,并且发出顺序也是由 GPU 强制执行的。
我尝试过 CUDA SDK 中给出的 simpleStreams 示例,我也看到了相同的行为。
我附上了一些屏幕截图,显示了 Visual Profiler 和 Nsight for VS2008 中的问题。
附注我没有设置 CUDA_LAUNCH_BLOCKING 环境
Simple Streams Visual Profiler
MyApp Nsight timeline breadth first
MyApp Nsight timeline depth first
edit:
添加额外的 x4 内核(每个流总共 2HtoD、5 个内核、1DtoH)-->
如果我在使用和不使用 --concurrent-kernels-off 的情况下运行 nvprof,则经过的时间是相同的。如果我设置 env CUDA_LAUNCH_BLOCKING=1,那么我会看到性能提升(从命令行)达 7.5%!
系统规格:
- Windows 7的
- 第一个 PCI-E 插槽中的 NVIDIA 6800 VGA
- 第二个 PCIE 插槽中的 GTX 480
- NVIDIA 驱动程序:306.94
- 视觉工作室2008
- CUDA v5.0
- 视觉分析器5.0
- 夜视3.0