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

我们真的可以通过CUDA streams获得性能提升吗?,cuda,Cuda,理论上,当我们在CUDA中使用streams时,我们应该获得性能增益。我实现了Gauss-seidel方法,令人惊讶的是,使用streams所需的时间比不使用streams所需的时间要长得多。有没有人有我可以看到性能增益的示例(SDK示例目录中给出的示例除外,这些示例不太有用)CUDA流允许在内核处理的同时执行PCI Express传输。根据阿姆达尔定律,只有执行等量数据传输和内核处理的工作负载才能从CUDA流中受益。要确定您的工作负载是否会受益,请对应用程序进行评测或添加一些计时代码,以了解理

理论上,当我们在CUDA中使用streams时,我们应该获得性能增益。我实现了Gauss-seidel方法,令人惊讶的是,使用streams所需的时间比不使用streams所需的时间要长得多。有没有人有我可以看到性能增益的示例(SDK示例目录中给出的示例除外,这些示例不太有用)CUDA流允许在内核处理的同时执行PCI Express传输。根据阿姆达尔定律,只有执行等量数据传输和内核处理的工作负载才能从CUDA流中受益。要确定您的工作负载是否会受益,请对应用程序进行评测或添加一些计时代码,以了解理论上最大的性能优势

请注意,为了从CUDA streams获得性能改进,您必须“软件管道”下载、内核启动和上载。这样做:

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流{
cudamemcpysync(设备[流]、主机[流]、…流);
}
foreach溪流{
启动内核(…);
//如果需要,您可以在流中启动多个内核。
}
foreach溪流{
cudamemcpysync(主机[流]、设备[流]、…流);
}
不是这个:

foreach stream {
    cudaMemcpyAsync( device[stream], host[stream], ... stream );
    LaunchKernel<<<...stream>>>( ... );
    cudaMemcpyAsync( host[stream], device[stream], ... stream );
}
foreach流{
cudamemcpysync(设备[流]、主机[流]、…流);
启动内核(…);
cudamemcpysync(主机[流]、设备[流]、…流);
}

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

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