理论上,当我们在CUDA中使用streams时,我们应该会获得性能提升。我实现了高斯-赛德尔方法,令人惊讶的是,使用streams所需的时间比没有使用streams.Does时要长得多。谁有我可以看到性能提升的例子(除了SDK的sample目录中给出的例子没有那么有用)。
发布于 2011-11-29 22:17:28
CUDA streams使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 );
}发布于 2011-11-30 17:59:04
是的,在计算时间很长并且所有数据都不是相互依赖的问题中。然后,您可以将昂贵的计算时间隐藏在已经很昂贵的内存传输中。
请注意,CUDA可以同时执行内存复制和内核执行,因此当一个流执行内存复制时,另一个流可以执行计算。
https://stackoverflow.com/questions/8284680
复制相似问题