2. API同步行为
该API提供了同步和异步形式的memcpy/memset函数,异步版本带有"Async"后缀。这种命名并不准确,因为每个函数的行为可能是同步或异步的,具体取决于传递给函数的参数。这些API的同步形式通过默认流来执行复制操作。
任何CUDA API调用都可能因各种原因(如内部资源争用或不可用)而阻塞或同步。此类行为可能会发生变化,不应依赖未记录的行为。
内存拷贝
在参考文档中,每个memcpy函数都被归类为同步或异步,对应以下定义。
-
对于从可分页主机内存到设备内存的传输,在复制开始前会执行流同步。该函数将在可分页缓冲区复制到用于DMA传输至设备内存的暂存内存后返回,但DMA到最终目的地的传输可能尚未完成。
-
对于从固定主机内存到设备内存的传输,该函数相对于主机是同步的。
-
对于从设备传输到可分页或固定主机内存的情况,该函数仅在复制完成后返回。
-
对于从设备内存到设备内存的传输,不会执行主机端同步。
-
对于从任意主机内存到任意主机内存的传输,该函数相对于主机是完全同步的。
-
在设备内存与可分页主机内存之间传输数据时,该函数可能会与主机同步执行。
-
对于从任意主机内存到任意主机内存的传输,该函数相对于主机是完全同步的。
-
如果可分页内存必须首先暂存到固定内存,驱动程序可能会与流同步并将副本暂存到固定内存中。
-
对于所有其他传输,该函数应该是完全异步的。