CUDA 驱动程序 API 有多个异步变体调用,例如
cuMemcpy2D
和 cuMemcpy2DAsync
,异步变体采用流句柄 - 还有更多。
调用 API 的同步变体与使用流句柄的 nullptr
/
NULL
调用异步变体是一样的情况吗?也就是说,人们可以放弃每次调用同步变体并始终使用异步变体?0
参数传递
hStream
并不等同于调用它们的非异步变体。每个 API 调用都在 CUDA 流上执行。传递 0
表示使用默认流。它与同步与同步问题正交。异步 API。
同步和异步 API 之间存在一些差异,但它们与特定流无关。以下同步和异步 API 调用的描述来自于
Driver API 文档同步
对于从可分页主机内存到设备内存的传输,在启动复制之前会执行流同步。功能 一旦可分页缓冲区被复制到暂存区就会返回 内存用于DMA传输到设备内存,但DMA到最终 目的地可能尚未完成。
- 对于从固定主机内存到设备内存的传输,该功能与主机同步。
- 对于从设备到可分页或固定主机内存的传输,该函数仅在复制完成后返回。
- 对于从设备内存到设备内存的传输,不执行主机端同步。
- 对于从任何主机内存到任何主机内存的传输,该功能与主机完全同步。
- 异步
对于设备内存和可分页主机内存之间的传输,该函数可能与主机同步。
- 对于从任何主机内存到任何主机内存的传输,该功能与主机完全同步。
- 如果必须首先将可分页内存暂存到固定内存,则驱动程序可以与流同步并将副本暂存到固定内存 记忆力。
- 对于所有其他传输,该函数应该是完全异步的。