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)
我很乐意听到任何有更多专业知识的人,不过这里还有什么需要注意的.
我认为更规范的方法是为每个设备创建一个流:
streams = [(device(dev); Stream()) for dev in devlist]
然后在@async块内,在告诉它进行计算之后,您使用该wait(stream)函数告诉它等待该流完成其计算。请参阅自述文件中的流示例。