2014-01-06 12 views
2

Предположим, у меня есть 4 графических процессора и вы хотите запустить 50 программ CUDA параллельно. Мой вопрос: является ли драйвер NVIDIA достаточно умным для запуска 50 программ CUDA на разных графических процессорах или мне нужно установить устройство CUDA для каждой программы?Несколько графических процессоров и несколько исполняемых файлов

спасибо

+0

Какой драйвер CUDA, точно? Существует более одного ответа на этот вопрос .... – talonmies

+0

Я использую драйвер nvidia версии 331.20 на linux с cuda 5.5. – adk

+0

Ответ talon отличный, просто что-то добавить: если ваши программы CUDA используют движок NVIDIA, убедитесь, что распределение рабочей нагрузки еще не поддерживается. Если они являются универсальными программами CUDA, то ответ талона, вероятно, единственный способ пойти IMHO –

ответ

5

Первый пункт, чтобы сделать то, что вы не можете запустить 50 приложений в параллельном на 4 GPU на любой платформе CUDA. Если у вас есть графический процессор с поддержкой Hyper-Q, есть возможность до 32 потоков или процессов обработки запросов MPI на GPU. В противном случае существует одна очередь команд.

Для всех, кроме новейших карт Kepler Tesla, драйвер CUDA поддерживает только один активный контекст за раз. Если вы запускаете больше одного приложения на графическом процессоре, процессы будут иметь контексты, которые просто конкурируют друг с другом в принципе «первым пришел, первым образом». Если одно приложение блокирует другое с длинным запущенным ядром или аналогичным, нет превентивного решения или чего-либо еще, что заставляет процесс перейти к другому процессу. Когда GPU делится с диспетчером дисплея, есть сторожевой таймер, который накладывает верхний предел за несколько секунд до того, как приложение потеряет свой контекст. В результате только один контекст когда-либо работает на оборудовании за раз. Контекстное переключение не является бесплатным, и существует ограничение производительности при наличии нескольких процессов, конкурирующих за одно устройство.

Кроме того, для каждого контекста, присутствующего на графическом процессоре, требуется память устройства. На платформе, о которой вы спрашиваете, linux, нет пейджинга в памяти, поэтому ресурсы каждого контекста должны сосуществовать в памяти GPU. Я не думаю, что можно было бы иметь 12 нетривиальных контекстов, работающих на любом текущем графическом процессоре одновременно, - у вас не хватило бы доступной памяти задолго до этого числа. Попытка запустить больше приложений приведет к сбою в создании контекста.

Что касается поведения драйвера, распределяющего несколько приложений на нескольких графических процессорах, AFAIK драйвер linux не выполняет интеллектуального распределения процессов между графическими процессорами, за исключением случаев, когда один или несколько графических процессоров находятся в режиме вычисления не по умолчанию , Если устройство не запрошено специально, драйвер всегда будет пытаться найти первый действительный бесплатный графический процессор, на котором он может запускать процесс или поток. Если GPU занят и помечен как выделенный (либо поток, либо процесс), либо помечен как запрещенный, тогда драйвер пропустит его, пытаясь найти графический процессор для запуска. Если все графические процессоры являются эксклюзивными, занятыми или запрещенными, приложение будет терпеть неудачу при отсутствии допустимой ошибки устройства.

Таким образом, для всех, кроме устройств Hyper-Q, нет увеличения производительности при выполнении того, о чем вы спрашиваете (совершенно наоборот), и я ожидал, что он сломается, если вы попробуете. Самым разумным подходом было бы использование исключительной исключительности в сочетании с планировщиком задач управления ресурсами, таким как Torque или один из (прежних) версий Sun Grid Engine, который мог бы планировать ваши процессы в упорядоченном порядке в зависимости от доступности графических процессоров. Таким образом, кластеры HPC общего назначения имеют дело с планированием в средах с несколькими GPU.

Смежные вопросы