CUDA / PyCUDA: На каком графическом процессоре работает X11? - PullRequest
2 голосов
/ 21 июня 2011

В системе Linux с несколькими графическими процессорами, как вы можете определить, какой графический процессор работает под управлением X11, а какой полностью свободен для запуска ядер CUDA?В системе с графическим процессором с низким энергопотреблением для запуска X11 и графическим процессором с более мощным процессором для работы с ядрами это можно определить с помощью некоторой эвристики для использования более быстрой карты.Но в системе с двумя равными картами этот метод не может быть использован.Существует ли API CUDA и / или X11, чтобы определить это?

ОБНОВЛЕНИЕ: Команда 'nvidia-smi -a' показывает, подключен ли «дисплей» или нет.Мне еще предстоит определить, означает ли это физически подключенный, логически подключенный (работает X11) или оба.Выполнение strace в этой команде показывает, сколько вызовов ioctl было вызвано, а вызовов X11 нет, поэтому предполагается, что карта сообщает о физическом подключении дисплея.

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

В структуре cudaDeviceProp имеется свойство устройства kernelExecTimeoutEnabled, которое будет указывать, подчинено ли устройство сторожевому таймеру дисплея.Это лучший показатель того, работает ли на данном устройстве CUDA X11 (или эквивалент Windows / Mac OS).

В PyCUDA вы можете запросить состояние устройства следующим образом:

In [1]: from pycuda import driver as drv

In [2]: drv.init()

In [3]: print drv.Device(0).get_attribute(drv.device_attribute.KERNEL_EXEC_TIMEOUT)
1

In [4]: print drv.Device(1).get_attribute(drv.device_attribute.KERNEL_EXEC_TIMEOUT)
0

Здесь к устройству 0 подключен дисплей, а устройство 1 является выделенным вычислительным устройством.

0 голосов
/ 21 июня 2011

Я не знаю ни одной библиотечной функции, которая могла бы это проверить. Однако на ум приходит один «взлом»: X11 или любой другой системный компонент, который управляет подключенным монитором, должен использовать часть памяти графического процессора.

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

Некоторое время назад я где-то читал (я не помню, где), что когда вы увеличиваете разрешение монитора, в то время как в GPU присутствует активный контекст CUDA, этот контекст может стать недействительным. Это намекает на то, что приведенное выше предложение может сработать. Обратите внимание, что я никогда не пробовал. Это просто мое дикое предположение.

Если вам удастся подтвердить, что это работает или нет, сообщите нам!

...