我刚刚开始使用Julia的CUDArt包来管理GPU计算。我想知道如何确保如果我从gpu中提取数据(例如使用to_host()
),在执行所有必要的计算之前我不这样做。
通过一些实验,似乎to_host(CudaArray)
会在特定的CudaArray更新时滞后。那么,或许只是使用它就足以确保安全?但它看起来有点渺茫。
现在,我正在使用launch()
函数来运行我的内核,如包documentation中所示。
CUDArt文档提供了一个使用Julia的@sync
宏的示例,看起来它可能很可爱。但是出于@sync
的目的,我完成了我的“工作”并准备好在内核使用launch()
启动时继续前进,而不是一旦完成。据我了解launch()
的操作 - 没有办法改变这个功能(例如,让它等待接收它“启动”的功能的输出。)
如何完成此类同步?
答案 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示例。