如何与Julia CUDArt同步?

时间:2016-06-19 01:12:07

标签: parallel-processing julia julia-gpu

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

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

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

CUDArt文档提供了一个使用Julia的@sync宏的示例,看起来它可能很可爱。但是出于@sync的目的,我完成了我的“工作”并准备好在内核使用launch()启动时继续前进,而不是一旦完成。据我了解launch()的操作 - 没有办法改变这个功能(例如,让它等待接收它“启动”的功能的输出。)

如何完成此类同步?

2 个答案:

答案 0 :(得分:10)

好的,那么,关于CUDArt包的文档并不多,但我查看了源代码,我认为它看起来很简单。特别是,似乎有一个OPTIONS="-g" OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g" OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g" OPTIONS="-u ntp:ntp" OPTIONS="-u" 函数将阻塞,直到当前活动设备上的所有工作都完成为止。因此,以下特别有效:

device_synchronize()

我很乐意听到任何有更多专业知识的人,不过在这里还有更多需要注意的地方。

答案 1 :(得分:1)

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

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

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