0

在 CUDA(驱动程序 API)文档中,它说

回调的开始执行与在回调之前同步记录在同一流中的事件具有相同的效果。因此,它会同步在回调之前“加入”的流。

这是否意味着如果我在每个关键点之后都有一个带有回调的管道来发送信号主机,我不需要任何 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) 
}
4

1 回答 1

1

CUDA 流有一些相当简单的语义。其中之一是所有发布到流中的活动都将按顺序执行。发布到特定流中的项目 B 将不会开始执行,直到在 B 之前发布到该流中的项目 A 完成。

所以,是的,发出到特定流的回调不会开始执行,直到该流中的所有先前活动都完成。

如果您希望在“普通”主机代码(即未包装在 CUDA 回调中的代码)中具有此特性,则需要某种显式活动,例如cuStreamSynchronizeor cuEventSynchronize、 orcuMemcpy或类似的。

出于本次讨论的目的,我将忽略 CUDA 托管内存,并假设您正在将数据从设备内存显式复制到主机内存,正如您所布置的那样。

于 2018-02-25T22:33:56.237 回答