我们真的可以通过CUDA流获得性能提升吗?

时间:2011-11-27 09:44:59

标签: cuda

理论上,当我们在CUDA中使用流时,我们应该获得性能提升我实现了Gauss-seidel方法,并且令人惊讶的是,流所需的时间远远大于没有流的情况。任何人都有可以看到性能增益的示例(除了给出的示例) SDK的示例目录不太有用)

2 个答案:

答案 0 :(得分:2)

CUDA流使PCI Express传输能够在内核处理的同时执行。由于Amdahl定律,只有执行相同数据传输和内核处理的工作负载才能从CUDA流中受益。要确定您的工作负载是否会受益,请为您的应用程序分析或添加一些时序代码,以了解理论上的最大性能优势。

请注意,为了从CUDA流中获得性能提升,您必须“软件管道”下载,内核启动和上传。这样做:

foreach stream {
    cudaMemcpyAsync( device[stream], host[stream], ... stream );
}
foreach stream {
    LaunchKernel<<<...stream>>>( ... );
    // you can launch multiple kernels in stream, if desired.
}
foreach stream {
    cudaMemcpyAsync( host[stream], device[stream], ... stream );
}

不是这个:

foreach stream {
    cudaMemcpyAsync( device[stream], host[stream], ... stream );
    LaunchKernel<<<...stream>>>( ... );
    cudaMemcpyAsync( host[stream], device[stream], ... stream );
}

答案 1 :(得分:1)

是,在计算时间很重要且所有数据不相互依赖的问题中。然后,您可以在昂贵的内存传输中隐藏昂贵的计算时间。

请注意,CUDA可以同时执行内存复制和内核执行,因此当一个流正在进行内存复制时,另一个流可以进行计算。