如何与 Julia CUDArt 同步?
How to Synchronize with Julia CUDArt?
我刚开始使用 Julia 的 CUDArt 包来管理 GPU 计算。我想知道如何确保如果我从 gpu 中提取数据(例如使用 to_host()
),我不会在对它执行所有必要的计算之前这样做。
通过一些实验,to_host(CudaArray)
似乎会在更新特定 CudaArray 时滞后。那么,也许仅仅使用这个就足以确保安全了?但这似乎有点偶然。
现在,我正在使用 launch()
函数来 运行 我的内核,如包 documentation 中所述。
CUDArt 文档给出了一个使用 Julia 的 @sync
宏的例子,看起来很可爱。但是出于 @sync
的目的,我已经完成了我的 "work" 并准备好在内核使用 launch()
启动后立即继续,而不是一旦它完成。据我了解 launch()
的操作 - 没有办法更改此功能(例如让它等待接收函数的输出 "launches")。
如何实现这种同步?
好的,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)
我很乐意听取任何具有更多专业知识的人的意见,但如果这里还有什么需要注意的。
我认为更规范的方法是为每个设备制作一个流:
streams = [(device(dev); Stream()) for dev in devlist]
然后在 @async
块内,在您告诉它进行计算后,您使用 wait(stream)
函数告诉它等待该流完成其计算。请参阅 README 中的 Streams 示例。
我刚开始使用 Julia 的 CUDArt 包来管理 GPU 计算。我想知道如何确保如果我从 gpu 中提取数据(例如使用 to_host()
),我不会在对它执行所有必要的计算之前这样做。
通过一些实验,to_host(CudaArray)
似乎会在更新特定 CudaArray 时滞后。那么,也许仅仅使用这个就足以确保安全了?但这似乎有点偶然。
现在,我正在使用 launch()
函数来 运行 我的内核,如包 documentation 中所述。
CUDArt 文档给出了一个使用 Julia 的 @sync
宏的例子,看起来很可爱。但是出于 @sync
的目的,我已经完成了我的 "work" 并准备好在内核使用 launch()
启动后立即继续,而不是一旦它完成。据我了解 launch()
的操作 - 没有办法更改此功能(例如让它等待接收函数的输出 "launches")。
如何实现这种同步?
好的,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)
我很乐意听取任何具有更多专业知识的人的意见,但如果这里还有什么需要注意的。
我认为更规范的方法是为每个设备制作一个流:
streams = [(device(dev); Stream()) for dev in devlist]
然后在 @async
块内,在您告诉它进行计算后,您使用 wait(stream)
函数告诉它等待该流完成其计算。请参阅 README 中的 Streams 示例。