Optimization cudaMemcpyAsync执行因某些原因而延迟

Optimization cudaMemcpyAsync执行因某些原因而延迟,optimization,cuda,cuda-streams,Optimization,Cuda,Cuda Streams,我尝试使用streams来并行运行H2D拷贝和内核。 为此,我创建了两个带有cudaStreamNonBlocking标志的流。 在循环中,我执行以下伪代码: // pseudocode cudaMemcpy(data[0]); streamIdx = 0; while(1) { // prepare for next loop cudaMemcpyAsync(dData[!streamIdx], hData[!streamIdx], stream[!stre

我尝试使用streams来并行运行H2D拷贝和内核。 为此,我创建了两个带有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;
}
//伪代码
cudaMemcpy(数据[0]);
streamIdx=0;
而(1)
{
//准备下一个循环
cudamemcpysync(dData[!streamIdx],hData[!streamIdx],
流[!streamIdx]);
//运行电流回路
cudaStreamSynchronize(流[streamIdx]);
内核1();
内核2();
streamIdx=!streamIdx;
}
主机内存被固定。 结果是每秒钟的cudaMemcpyAsync都会延迟,这会导致代码运行变慢。 见图表:

我设法欺骗复制引擎,在复制的同一个流上运行一个伪内核,使其立即运行

是否有任何正常的方法使GPU立即执行CUDAMEMCPIASYNC


我使用GeForce GTX 1060 6GB GPU

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;
}
while(1)
{
//准备下一个循环
cudaMemcpyAsync(dData[streamIdx]、hData[streamIdx]、stream[streamIdx]);
//运行电流回路
内核1();
内核2();
streamIdx=!streamIdx;
}

这可能是wddm命令批处理。你在windows上吗?如果是这样,就没有正常的方法来避免它。异常的方法包括重新构造代码,和/或使用其他可能不必要的命令,例如额外的内核启动或额外的cudaAPI调用(如cudaStreamQuery),以便在需要时刷新命令队列。或者您可以切换到linux,或者您可以切换到可以在windows上置于TCC模式的GPU(GeForce GPU不能,titans除外)。我确实使用windows。cudaStreamQuery用于刷新队列。主机端内存是否已分配?