cuStreamAddCallback 是否与 cuStreamSynchronize 在主机上拥有最新数据位一样有效?
Is cuStreamAddCallback as effective as cuStreamSynchronize in having latest bits of data on host?
在 CUDA(驱动程序 API)文档中,它说
The start of execution of a callback has the same effect as
synchronizing an event recorded in the same stream immediately prior
to the callback. It thus synchronizes streams which have been "joined"
prior to the callback.
这是否意味着如果我在每个关键点之后都有一个带有回调的管道来向主机发出信号,我不需要任何 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)
}
CUDA 流有一些相当简单的语义。其中之一是发出到流中的所有 activity 都将执行 in-order。发布到特定流中的项目 B 将不会开始执行,直到先于 B 发布到该流中的项目 A 完成。
所以,是的,发出到特定流中的回调将不会开始执行,直到该流中所有先前的 activity 完成。
如果您想在 "ordinary" 主机代码中使用此特性(即未包含在 CUDA 回调中的代码),则需要某种显式 activity,例如 cuStreamSynchronize
或 cuEventSynchronize
,或 cuMemcpy
,或类似的。
出于讨论的目的,我忽略了 CUDA 托管内存,并假设您正在将数据从设备内存显式复制到主机内存,正如您所布局的那样。
在 CUDA(驱动程序 API)文档中,它说
The start of execution of a callback has the same effect as synchronizing an event recorded in the same stream immediately prior to the callback. It thus synchronizes streams which have been "joined" prior to the callback.
这是否意味着如果我在每个关键点之后都有一个带有回调的管道来向主机发出信号,我不需要任何 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)
}
CUDA 流有一些相当简单的语义。其中之一是发出到流中的所有 activity 都将执行 in-order。发布到特定流中的项目 B 将不会开始执行,直到先于 B 发布到该流中的项目 A 完成。
所以,是的,发出到特定流中的回调将不会开始执行,直到该流中所有先前的 activity 完成。
如果您想在 "ordinary" 主机代码中使用此特性(即未包含在 CUDA 回调中的代码),则需要某种显式 activity,例如 cuStreamSynchronize
或 cuEventSynchronize
,或 cuMemcpy
,或类似的。
出于讨论的目的,我忽略了 CUDA 托管内存,并假设您正在将数据从设备内存显式复制到主机内存,正如您所布局的那样。