8

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

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

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

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

我怎样才能完成这样的同步?

4

2 回答 2

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)

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

于 2016-06-19T14:23:54.820 回答
1

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

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

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

于 2016-07-11T00:35:27.700 回答