Как синхронизировать с Юлией 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)

Я хотел бы услышать от кого-то с большим опытом, хотя, если есть что-нибудь еще, чтобы быть в курсе здесь.

Другие вопросы по тегам