是的,当 stream 为 0 时,cudaMemcpyHostToDevice 或者 cudaMemcpyDeviceToHost 类型的 cudaMemcpyAsync 相当于同步拷贝。这意味着,在调用这些函数后,程序将会等待拷贝操作完成,才能继续执行后面的代码。因此,可以将它们视为同步函数。

当 stream 为 0 时,CUDA 运行时会将拷贝操作加入到默认流(default stream)中。默认流是每个 CUDA 上下文唯一的一个流,它总是处于活动状态,并且所有在默认流中提交的任务都会按照顺序执行。

由于默认流中的操作必须按顺序完成,所以当 stream 为 0 时,cudaMemcpyAsync 实际上会阻塞调用线程,直到拷贝操作完成。这与同步拷贝的行为一致,因此可以将它们视为等效的。

然而,需要注意的是,即使 cudaMemcpyAsync 在 stream 为 0 时等同于同步拷贝,它仍然是异步函数。这意味着,它不会阻塞 GPU 上其他非默认流的操作执行。

总结而言,当 stream 为 0 时,cudaMemcpyHostToDevice 或 cudaMemcpyDeviceToHost 类型的 cudaMemcpyAsync 实际上会阻塞调用线程,直到拷贝操作完成,因此等效于同步拷贝。但它仍然是异步函数,不会阻塞 GPU 上其他非默认流的操作执行。

为了提高性能,建议在需要进行异步内存拷贝时,使用非默认流。这将允许 CPU 和 GPU 并行执行,从而提高程序效率。

CUDA 异步内存拷贝:stream 为 0 时等效于同步拷贝?

原文地址: https://www.cveoy.top/t/topic/oIua 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录