environment variableCUDA_VISIBLE_DEVICES
является вашим другом.
Я предполагаю, что у вас так много терминалов, как у вас есть графические процессоры. Допустим, ваше приложение называется myexe
Затем в одном терминале, вы могли бы сделать:
CUDA_VISIBLE_DEVICES="0" ./myexe
В следующем терминале:
CUDA_VISIBLE_DEVICES="1" ./myexe
и так далее.
Тогда первый экземпляр будет запущен на первом графическом процессоре, указанном CUDA. Второй экземпляр будет работать на втором графическом процессоре (только) и так далее.
Предполагая Баш, и для данного сеанса терминала, вы можете сделать это «постоянный», экспортируя переменную:
export CUDA_VISIBLE_DEVICES="2"
после этого, все приложения CUDA работать в этой сессии будет наблюдать лишь третий перечисляемого GPU (перечисление начинается с 0), и они будут наблюдать, что GPU , как если бы это было устройство 0 в их сеансе.
Это означает, что вам не нужно вносить какие-либо изменения в приложение для этого метода, при условии, ваше приложение использует GPU по умолчанию или GPU 0.
Вы также можете расширить это сделать несколько графических процессоров доступны, например, :
export CUDA_VISIBLE_DEVICES="2,4"
означает графические процессоры, которые обычно перечислять как 2 и 4 теперь будет только графические процессоры «видны» в этой сессии, и они будут перечислять в 0 и 1.
на мой взгляд выше подход является самым простым.Выбор GPU, что «не используется» является проблематичным, так как:
- нам нужно определение «в использовании»
- ГПУ, использовавшееся в определенный момент времени не может быть в использовании сразу же после того, как что
- Самое главное, что графический процессор, который не используется, может быть «использован» асинхронно, что означает, что вы подвергаетесь условиям гонки.
Таким образом, лучший совет (IMO) - это управлять графическими процессорами явно. В противном случае вам понадобится какая-то форма планировщика заданий (вне сферы действия этого вопроса, IMO), чтобы иметь возможность запрашивать неиспользуемые графические процессоры и «резервировать» их до того, как другое приложение попытается сделать это упорядоченным образом.
http://www.nvidia.com/docs/IO/116711/sc11-multi-gpu.pdf - это лучший хит google ваш вопрос. Решает ли ваша проблема? – Yakk
Не совсем, что адреса, использующие несколько графических процессоров в одном приложении CUDA, я прошу о запуске нескольких программ CUDA одновременно на нескольких графических процессорах (но еще 1 GPU на один экземпляр). Это потребует значительного переписывания для моего кода для обработки нескольких партий в одном экземпляре. – aseal
Вы делаете асинхронные звонки? Разделите группу на подгруппы N (где N - количество графических процессоров), отправьте каждую подгруппу на другой графический процессор, а затем соберете их снова? – Yakk