由于某种原因,cudaMemcpyAsync执行被延迟

时间:2016-11-07 07:45:19

标签: optimization cuda cuda-streams

我正在尝试使用流来运行H2D副本并且内核并行运行。 为此,我使用cudaStreamNonBlocking标志创建了2个流。 在循环中,我执行以下伪代码:

// pseudocode
cudaMemcpy(data[0]);
streamIdx = 0;

while(1)
{
    // prepare for next loop
    cudaMemcpyAsync(dData[!streamIdx], hData[!streamIdx], 
        stream[!streamIdx]);
    // run current loop
    cudaStreamSynchronize(stream[streamIdx]);
    kernel1<stream[streamIdx]>();
    kernel2<stream[streamIdx]>();
    streamIdx = !streamIdx;
}

主机内存固定。 结果是每秒cudaMemcpyAsync都被延迟,这导致代码运行得更慢。 见图: enter image description here

我设法通过在副本的同一个流上运行假内核来欺骗复制引擎,只是为了让它立即运行。

有没有 NORMAL 方法让GPU立即执行cudaMemcpyAsync?

我使用的是GeForce GTX 1060 6GB GPU

1 个答案:

答案 0 :(得分:1)

cudaStreamSynchronize 强制CPU阻止等待流空闲。在您的情况下,CPU无需阻塞即可,而只需继续为GPU供电。

像这样重构代码:

while(1)
{
    // prepare for next loop
    cudaMemcpyAsync(dData[streamIdx], hData[streamIdx], stream[streamIdx]);
    // run current loop
    kernel1<stream[streamIdx]>();
    kernel2<stream[streamIdx]>();
    streamIdx = !streamIdx;
}