CUDA/PyCUDA: На каком графическом процессоре работает X11?
В системе Linux с несколькими графическими процессорами, как вы можете определить, какой графический процессор работает под управлением X11, а какой полностью свободен для запуска ядер CUDA? В системе с графическим процессором с низким энергопотреблением для запуска X11 и графическим процессором с более мощным процессором для работы с ядрами это может быть определено с помощью некоторой эвристики для использования более быстрой карты. Но в системе с двумя равными картами этот метод нельзя использовать. Существует ли CUDA и / или X11 API для определения этого?
ОБНОВЛЕНИЕ: команда 'nvidia-smi -a' показывает, подключен ли "дисплей" или нет. Мне еще предстоит определить, означает ли это физически подключенный, логически подключенный (работает X11) или оба. Выполнение strace в этой команде показывает, сколько вызовов ioctl было вызвано, и вызовов X11 нет, поэтому предполагается, что карта сообщает о физическом подключении дисплея.
2 ответа
Есть свойство устройства kernelExecTimeoutEnabled
в cudaDeviceProp
структура, которая укажет, является ли устройство объектом сторожевого таймера дисплея. Это лучший показатель того, работает ли на данном устройстве 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 является выделенным вычислительным устройством.
Я не знаю библиотечной функции, которая могла бы это проверить. Однако на ум приходит один "взлом": X11 или любой другой системный компонент, который управляет подключенным монитором, должен потреблять часть памяти графического процессора.
Итак, проверьте, сообщают ли оба устройства об одном и том же объеме доступной глобальной памяти через cudaGetDeviceProperties, а затем проверьте значение поля totalGlobalMem. Если это то же самое, попробуйте выделить этот (или только немного меньший) объем памяти на каждом графическом процессоре и посмотрите, какой из них этого не делает (cudaMalloc возвращает флаг ошибки).
Некоторое время назад я где-то читал (я не помню, где), что когда вы увеличиваете разрешение монитора, в то время как в графическом процессоре есть активный контекст CUDA, этот контекст может стать недействительным. Это намекает на то, что приведенное выше предложение может сработать. Обратите внимание, что я никогда не пробовал. Это просто мое дикое предположение.
Если вам удастся подтвердить, что это работает или нет, сообщите нам!