CUDA流不重叠

时间:2011-05-20 10:10:52

标签: cuda cuda-streams

我有一些与代码非常相似的东西:

int k, no_streams = 4;
cudaStream_t stream[no_streams];
for(k = 0; k < no_streams; k++) cudaStreamCreate(&stream[k]);

cudaMalloc(&g_in,  size1*no_streams);
cudaMalloc(&g_out, size2*no_streams);

for (k = 0; k < no_streams; k++)
  cudaMemcpyAsync(g_in+k*size1/sizeof(float), h_ptr_in[k], size1, cudaMemcpyHostToDevice, stream[k]);

for (k = 0; k < no_streams; k++)
  mykernel<<<dimGrid, dimBlock, 0, stream[k]>>>(g_in+k*size1/sizeof(float), g_out+k*size2/sizeof(float));

for (k = 0; k < no_streams; k++)
  cudaMemcpyAsync(h_ptr_out[k], g_out+k*size2/sizeof(float), size2, cudaMemcpyDeviceToHost, stream[k]);

cudaThreadSynchronize();

cudaFree(g_in);
cudaFree(g_out);

'h_ptr_in'和'h_ptr_out'是用cudaMallocHost分配的指针数组(没有标志)。

问题是流不重叠。 在visual Profiler中,我可以看到第一个流中的内核执行与第二个流中的副本(H2D)重叠,但没有其他重叠。

我可能没有资源来运行2个内核(我想我这样做)但至少内核执行和副本应该重叠,对吧? 如果我把所有3个(复制H2D,内核执行,复制D2H)放在同一个for循环中,它们都没有重叠......

请帮助,这可能导致什么?

我正在继续:

Ubuntu 10.04 x64

设备:“GeForce GTX 460”   (CUDA驱动程序版本:3.20,   CUDA运行时版本:3.20,   CUDA能力主要/次要版本号:2.1,   并发复制和执行:是的,   并发内核执行:是)

2 个答案:

答案 0 :(得分:7)

根据NVIDIA论坛上的this post,探查器将序列化流媒体以获得准确的计时数据。如果您认为您的时间关闭,请确保您正在使用CUDA活动......

我最近一直在尝试流式传输,我发现SDK中的“simpleMultiCopy”示例确实非常有用,特别是在适当的逻辑和同步方面。

答案 1 :(得分:3)

如果要查看内核与内核(并发内核)重叠,则需要使用CUDA 5.0 Toolkit附带的CUDA Visual Profiler 5.0。我不认为以前的分析师能够做到这一点。它还应该显示内核和memcpy重叠。