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