Как синхронизировать с Юлией CUDArt?
Я только начинаю использовать пакет Julia CUDArt для управления вычислениями на GPU. Мне интересно, как убедиться, что если я пойду извлекать данные из GPU (например, используя to_host()
) что я не делаю этого до того, как все необходимые вычисления будут выполнены на нем.
После некоторых экспериментов кажется, что to_host(CudaArray)
будет отставать, пока обновляется конкретный CudaArray. Так что, возможно, достаточно просто использовать это, чтобы обеспечить безопасность? Но это кажется немного случайным.
Прямо сейчас я использую launch()
функция для запуска моих ядер, как показано в документации к пакету.
В документации CUDArt приведен пример использования Julia @sync
макрос, который, кажется, может быть прекрасным. Но для целей @sync
Я закончил свою "работу" и готов двигаться дальше, как только ядро запустится с launch()
, не раз это заканчивается. Насколько я понимаю, операция launch()
- нет способа изменить эту функцию (например, заставить его ждать, чтобы получить вывод функции, которую она "запускает").
Как я могу выполнить такую синхронизацию?
2 ответа
Я думаю, что более канонический способ - создать поток для каждого устройства:
streams = [(device(dev); Stream()) for dev in devlist]
а затем внутри @async
блок, после того, как вы скажете это делать вычисления, вы используете wait(stream)
функция, чтобы сказать ему, чтобы ждать, пока этот поток завершит свои вычисления. Смотрите пример потоков в README.
Итак, нет никакой тонны документации по пакету 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)
Я хотел бы услышать от кого-то с большим опытом, хотя, если есть что-нибудь еще, чтобы быть в курсе здесь.