在CUDA(驱动程序API)文档中,它说
开始执行回调具有与之相同的效果 紧接之前同步在同一流中记录的事件 回调。因此,它同步了已经加入的流和#34; 在回调之前。
这是否意味着如果我在信号主机的每个关键点之后有一个带回调的管道,我不需要任何cuStreamSynchronize来使这些点能够访问输出数组?
非常简单的代码,如
cuda memcpy host to device
cuda launch kernel
cuda memcpy device to host
add callback
callback()
{
here, safe to access host "results" array?
(considering no more cuda commands on these arrays)
}
答案 0 :(得分:1)
CUDA流有一些相当简单的语义。其中之一是发布到流中的所有活动都将按顺序执行。发布到特定流中的项目B将不会开始执行,直到在B之前的流中发布的项目A完成。
所以,是的,发送到特定流的回调将不会开始执行,直到该流中的所有先前活动都已完成。
如果你想在"普通"主机代码(即未包含在CUDA回调中的代码),它需要某种显式活动,例如cuStreamSynchronize
或cuEventSynchronize
,或cuMemcpy
,或类似。
出于本讨论的目的,我忽略了CUDA管理的内存,并假设您正在从设备内存到主机内存进行明确的数据复制,正如您所说的那样。