Предварительно скомпилировать ядра numba cuda (не jit) - PullRequest
0 голосов
/ 09 апреля 2020

Привет! Я использую numba для написания некоторых ядер с помощью декоратора @cuda.jit. У меня есть 8 потоков процессора, каждый из которых вызывает ядро ​​на одном из двух графических устройств. (cpu_idx % len(cuda.gpus) уточняется c)

Я полагаю, что каждый поток ЦП компилирует ядро, что занимает много времени по сравнению со временем, которое требуется ядру для обработки всего образа. В идеале он должен быть скомпилирован только один раз для всех потоков ЦП. Но я не могу инициализировать любой код cuda gpu перед разветвлением с multiprocessing.Pool, потому что cuda это не нравится.

Так есть ли способ предварительной компиляции ядер cuda? Я не хочу сборник точно в срок

1 Ответ

2 голосов
/ 21 апреля 2020

Вы можете использовать Eager Compilation для предварительной компиляции ядра CUDA для данной подписи: http://numba.pydata.org/numba-doc/latest/user/jit.html?highlight=eager#eager -компиляция

Обратите внимание, что бэкэнд CUDA поддерживает только одну подпись для Eager Compilation (в то время как цель CPU поддерживает несколько), и ядра, скомпилированные Eager, не проверяют типы при вызове ядра. Это приводит к более быстрому запуску, но открывает возможность незамеченной пользовательской ошибки, позволяя типам аргументов не соответствовать между скомпилированным ядром и тем, что передается.

Однако, отмечая из вашего вопроса, что вы При использовании нескольких процессов, а не потоков, у вас по-прежнему будет проблема, поскольку вам придется предварительно скомпилировать и затем выполнить ветвь, что CUDA все равно не понравится. Возможно ли вам использовать потоки в вашем приложении с модулем потоков вместо этого?

Дополнительный вопрос: если время выполнения вашего приложения / ядра графического процессора настолько мало, что время компиляции составляет доминирующий фактор, имеет ли смысл использовать GPU для вашего приложения? После того, как вы обработали одно изображение в каждом потоке, даже при JIT-компиляции, не будет повторных накладных расходов для этого потока - при последующих запусках ядро ​​будет извлечено из кеша. Если бы вы обрабатывали много изображений, время компиляции стало бы незначительным в общем времени выполнения.

...