PyCuda; как динамически распределить нагрузку на несколько устройств - PullRequest
1 голос
/ 28 апреля 2011

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

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

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

PS Моя машина для разработки - 1 GPU, а моя тестовая машина - 4 GPU, поэтому мне нужно любое решение для работы с динамическим числом устройств (это также не значит, что у них разные вычислительные возможности, но вот и жизнь)

1 Ответ

1 голос
/ 28 апреля 2011

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

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

...