看完《CUDA C编程指南》中CUDA的“数据传输和内核执行的重叠”部分,我有个疑问:数据传输到底指的是什么?是否包括
cudaMemsetAsync
,cudaMemcpyAsync
,cudaMemset
,cudaMemcpy
. 当然,分配给 memcpy 的内存是固定的。在隐式同步(流)部分,书中说“设备内存集”可以序列化流。那么,它指的是
cudaMemsetAsync
,cudaMemcpyAsync
,cudaMemcpy
,cudaMemcpy
吗?我不确定。
问问题
1023 次
1 回答
2
任何以Async
a 结尾的函数调用都有一个流参数。此外,CUDA 工具包提供的一些库也有设置流的选项。通过使用它,您可以同时运行多个流。
这意味着,除非您专门创建和设置流,否则您将使用默认流。例如,没有默认值data transfer
和kernel execution
流。您将必须创建两个(或更多)流,并为它们分配选择的任务。
一个常见的用例是拥有编程指南中提到的两个流。请记住,这仅在您启动多个内核时才有用。在计算当前内核的结果时,您可以获得下一个(独立)内核或当前内核的下一次迭代所需的数据。这可以最大化计算和带宽能力。
对于您提到的函数调用,cudaMemcpy
并且cudaMemcpyAsync
是唯一执行数据传输的函数。我不认为cudaMemset
并且cudaMemsetAsync
可以称为数据传输。
两者cudaMempyAsync
和cudaMemsetAsync
都可以与流一起使用,而cudaMemset
和cudaMemcpy
正在阻塞不使用流的调用。
于 2012-12-30T04:59:10.080 回答