理论上,当我们在CUDA中使用流时,我们应该获得性能提升我实现了Gauss-seidel方法,并且令人惊讶的是,流所需的时间远远大于没有流的情况。任何人都有可以看到性能增益的示例(除了给出的示例) SDK的示例目录不太有用)
答案 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可以同时执行内存复制和内核执行,因此当一个流正在进行内存复制时,另一个流可以进行计算。