2. API 同步行为
该 API 提供了同步和异步形式的 memcpy/memset 函数,后者带有 “Async” 后缀。这是一个用词不当,因为每个函数都可能根据传递给函数的参数表现出同步或异步行为。这些 API 的同步形式通过默认流发出这些拷贝。
任何 CUDA API 调用都可能因各种原因而阻塞或同步,例如内部资源的争用或不可用。这种行为可能会发生变化,不应依赖未记录的行为。
Memcpy
在参考文档中,每个 memcpy 函数都分为同步或异步,对应于以下定义。
-
对于从可分页主机内存到设备内存的传输,在启动复制之前会执行流同步。一旦可分页缓冲区已复制到用于 DMA 传输到设备内存的暂存内存,该函数将返回,但到最终目的地的 DMA 可能尚未完成。
-
对于从已锁定主机内存到设备内存的传输,该函数相对于主机是同步的。
-
对于从设备到可分页或已锁定主机内存的传输,该函数仅在复制完成后才返回。
-
对于从设备内存到设备内存的传输,不执行主机端同步。
-
对于从任何主机内存到任何主机内存的传输,该函数相对于主机是完全同步的。
-
对于设备内存和可分页主机内存之间的传输,该函数可能相对于主机是同步的。
-
对于从任何主机内存到任何主机内存的传输,该函数相对于主机是完全同步的。
-
如果可分页内存必须首先暂存到已锁定内存,则驱动程序可能会与流同步并将副本暂存到已锁定内存中。
-
对于所有其他传输,该函数应完全异步。