如何与 Julia CUDArt 同步?

How to Synchronize with Julia CUDArt?

我刚开始使用 Julia 的 CUDArt 包来管理 GPU 计算。我想知道如何确保如果我从 gpu 中提取数据(例如使用 to_host()),我不会在对它执行所有必要的计算之前这样做。

通过一些实验,to_host(CudaArray) 似乎会在更新特定 CudaArray 时滞后。那么,也许仅仅使用这个就足以确保安全了?但这似乎有点偶然。

现在,我正在使用 launch() 函数来 运行 我的内核,如包 documentation 中所述。

CUDArt 文档给出了一个使用 Julia 的 @sync 宏的例子,看起来很可爱。但是出于 @sync 的目的,我已经完成了我的 "work" 并准备好在内核使用 launch() 启动后立即继续,而不是一旦它完成。据我了解 launch() 的操作 - 没有办法更改此功能(例如让它等待接收函数的输出 "launches")。

如何实现这种同步?

好的,CUDArt 包上没有大量文档,但我查看了源代码,我认为它看起来很简单,说明如何执行此操作。特别是,似乎有一个 device_synchronize() 函数会阻塞,直到当前活动设备上的所有工作都完成为止。因此,以下内容尤其有效:

using CUDArt
md = CuModule("/path/to/module.ptx",false)
MyFunc = CuFunction(md,"MyFunc")
GridDim = 2*2496
BlockDim = 64
launch(MyFunc, GridDim, BlockDim, (arg1, arg2, ...)); 
device_synchronize()
res = to_host(arg2)

我很乐意听取任何具有更多专业知识的人的意见,但如果这里还有什么需要注意的。

我认为更规范的方法是为每个设备制作一个流:

streams = [(device(dev); Stream()) for dev in devlist]

然后在 @async 块内,在您告诉它进行计算后,您使用 wait(stream) 函数告诉它等待该流完成其计算。请参阅 README 中的 Streams 示例。