PyCUDA; как динамически распределять рабочую нагрузку на несколько устройств

#python #cuda #gpgpu #pycuda #multi-gpu

#python #cuda #gpgpu #pycuda #мульти-графический процессор

Вопрос:

PyCUDA, при всех ее недостатках, обычно содержит очень хорошие примеры, прилагаемые к ней / загружаемые из wiki. Но я не смог найти ничего в примерах или в документации (или при беглом поиске в Google), демонстрирующего способ PyCUDA динамического распределения рабочих нагрузок на несколько устройств.

Может кто-нибудь либо подсказать мне, что я должен делать, либо указать мне на примеры?

Одна идея, которая пришла мне в голову, заключалась в использовании многопроцессорной обработки, создании пула из N процессов, каждый из которых привязан к одному устройству, а затем, когда вызывается класс (у меня все функции графического процессора находятся в отдельном классе; возможно, не лучшая идея, но она работает), выполняется циклический перебор многопроцессорных процессов. Насколько это хорошая / отсталая идея?

PS На моей машине разработки установлен 1 графический процессор, а на моей тестовой машине — 4 графических процессора, поэтому мне нужно любое решение, способное работать с динамическим количеством устройств (также не помогает то, что у них разные вычислительные возможности, но такова жизнь)

Ответ №1:

В Pycuda не было встроенной поддержки нескольких графических процессоров, поскольку в CUDA также не было встроенной поддержки нескольких графических процессоров. Это изменится в CUDA 4.0, потому что API был изменен, чтобы быть потокобезопасным и поддерживать работу с несколькими графическими процессорами. Но в Pycuda пока нет такой поддержки AFAIK. Даже когда это происходит, каждым устройством нужно управлять явно, а рабочую нагрузку распределять самостоятельно. Автоматического распределения рабочей нагрузки или чего-либо подобного не существует.

Для работы с несколькими графическими процессорами я обычно использовал mpi4py. Потенциально вы могли бы использовать многопоточную схему python, при которой каждый поток открывает отдельный контекст в Pycuda. То, что работает лучше всего, вероятно, будет зависеть от того, сколько связи требуется между устройствами.