#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. То, что работает лучше всего, вероятно, будет зависеть от того, сколько связи требуется между устройствами.