Канонический способ выбора устройства в API времени выполнения - cudaSetDevice
. Это настроит среду выполнения для выполнения отложенного установления контекста на назначенном устройстве. До CUDA 4.0 этот вызов на самом деле не устанавливал контекст, он просто говорил среде выполнения, какой графический процессор попробовать и использовать. Начиная с CUDA 4.0, этот вызов создаст контекст для назначенного графического процессора во время вызова. Существует также cudaChooseDevice
, который будет выбирать среди доступных устройств для поиска устройства, которое соответствует критериям, предоставленным вызывающим абонентом.
Вы можете перечислить доступные графические процессоры в системе с помощью cudaGetDeviceCount
и получить их данные, используя cudaGetDeviceProperties
. Пример SDK deviceQuery показывает полную информацию о том, как это сделать.
Однако, возможно, вам нужно быть осторожным при выборе графических процессоров в системе с несколькими графическими процессорами в зависимости от конфигурации хоста и драйвера. Как в драйвере Linux, так и в драйвере TCC для Windows существует возможность пометить графические процессоры как «вычислить исключительные», что означает, что драйвер будет ограничивать каждый графический процессор одним активным контекстом за раз или вычислять запрещено, что означает, что ни одна программа CUDA не может установить контекст на этом устройстве. Если ваш код пытается установить контекст на запрещенном для вычислений устройстве или на используемом исключительном вычислительном устройстве, результатом будет недопустимая ошибка устройства. В системе с несколькими графическими процессорами, где политика заключается в использовании исключительности вычислений, правильным подходом является не попытка выбрать конкретный графический процессор, а просто возможность неявного создания отложенного контекста. Драйвер автоматически выберет бесплатный графический процессор для вашего кода. Состояние режима вычислений любого устройства можно проверить, прочитав поле cudaDeviceProp.computeMode
с помощью вызова cudaGetDeviceProperties
. Обратите внимание, что вы можете проверять недоступные или запрещенные графические процессоры и запрашивать их свойства, но любая операция, которая потребует установки контекста, не будет выполнена.
См. Документацию по API времени выполнения для всех этих вызовов
.