2

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

// 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 都会延迟,这会导致代码运行速度变慢。见图: 在此处输入图像描述

我设法通过在复制的同一流上运行假内核来欺骗复制引擎,以使其立即运行。

有什么正常的方法可以让 GPU 立即执行 cudaMemcpyAsync 吗?

我使用 GeForce GTX 1060 6GB GPU

4

1 回答 1

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;
}
于 2018-07-27T15:01:30.860 回答