如何与Julia CUDArt同步?

Mic*_*gge 8 parallel-processing julia julia-gpu

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

通过一些实验,似乎to_host(CudaArray)在特定的CudaArray更新时会滞后.那么,或许只是使用它就足以确保安全?但它看起来有点渺茫.

现在,我正在使用该launch()函数来运行我的内核,如包文档中所述.

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

我怎样才能实现这种同步?

Mic*_*gge 10

好的,所以,关于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)
Run Code Online (Sandbox Code Playgroud)

我很乐意听到任何有更多专业知识的人,不过这里还有什么需要注意的.

  • 请注意:未记录的功能可供内部使用(因此缺少文档).显然情况并非如此,但是,如果您使用这些功能,则在升级到下一个版本时可能会让您自己陷入困境.软件包和库所有者倾向于更加轻松地修改或彻底删除未记录的功能,即使在次要版本之间也是如此.谨慎行事,务必写回归测试. (7认同)

Chr*_*kas 1

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

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

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