2. API同步行为

该API提供了同步和异步形式的memcpy/memset函数,异步版本带有"Async"后缀。这种命名并不准确,因为每个函数的行为可能是同步或异步的,具体取决于传递给函数的参数。这些API的同步形式通过默认流来执行复制操作。

任何CUDA API调用都可能因各种原因(如内部资源争用或不可用)而阻塞或同步。此类行为可能会发生变化,不应依赖未记录的行为。

内存拷贝

在参考文档中,每个memcpy函数都被归类为同步或异步,对应以下定义。

同步

  1. 对于从可分页主机内存到设备内存的传输,在复制开始前会执行流同步。该函数将在可分页缓冲区复制到用于DMA传输至设备内存的暂存内存后返回,但DMA到最终目的地的传输可能尚未完成。

  2. 对于从固定主机内存到设备内存的传输,该函数相对于主机是同步的。

  3. 对于从设备传输到可分页或固定主机内存的情况,该函数仅在复制完成后返回。

  4. 对于从设备内存到设备内存的传输,不会执行主机端同步。

  5. 对于从任意主机内存到任意主机内存的传输,该函数相对于主机是完全同步的。

异步

  1. 在设备内存与可分页主机内存之间传输数据时,该函数可能会与主机同步执行。

  2. 对于从任意主机内存到任意主机内存的传输,该函数相对于主机是完全同步的。

  3. 如果可分页内存必须首先暂存到固定内存,驱动程序可能会与流同步并将副本暂存到固定内存中。

  4. 对于所有其他传输,该函数应该是完全异步的。

内存设置

cudaMemset函数相对于主机是异步的,除非目标内存是固定的主机内存。Async版本相对于主机始终是异步的。

内核启动

内核启动相对于主机是异步的。有关并发内核执行和数据传输的详细信息可以在CUDA程序员指南中找到。