PyCUDA, несмотря на все его ошибки, обычно имеет очень хорошие примеры, предоставляемые с ней/загружаемые из вики. Но я не мог найти ничего в примерах или в документации (или беглого поиска Google), демонстрируя способ PyCUDA по распределению рабочих нагрузок на несколько устройств.
Может кто-нибудь намекнуть мне, что я должен делать, или указать на примеры?
Одна идея, которая появилась у меня в голове, заключалась в многопроцессорной обработке, создании пула из N процессов, каждый из которых привязан к одному устройству, а затем при вызове класса (у меня есть все мои функции gpu в отдельном классе, возможно, не самые лучшие идея, но она работает), она объединит многопроцессы. Насколько хороша/отсталая идея?
PS Моя машина для разработчиков - 1 GPU, а мой тестовый компьютер - на 4 GPU, поэтому мне нужно, чтобы какое-либо решение могло иметь дело с динамическим числом устройств (это также не помогает разным вычислительным возможностям, но thats life)
Pycuda не имеет встроенной поддержки нескольких GPU, поскольку CUDA также не имеет встроенной поддержки нескольких GPU. Это изменится в CUDA 4.0, потому что API был изменен на потокобезопасный и многопроцессорный. Но у Пикуды еще нет такой поддержки AFAIK. Даже когда дело доходит, каждое устройство должно быть явно управляемым, а рабочая нагрузка разделена на вас. Нет автоматического распределения рабочей нагрузки или чего-либо подобного.
Для многопроцессорного GPU я обычно использовал mpi4py. Вы могли бы использовать многопоточную схему python, причем каждый поток открывает отдельный контекст в Pycuda. Что лучше всего работает, вероятно, будет зависеть от того, сколько требуется связи между устройствами.