CUDA/PyCUDA: на каком графическом процессоре работает X11?

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

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


person dwelch91    schedule 21.06.2011    source источник
comment
Почему GPU не может одновременно работать с X и CUDA? X не требует такой обработки.   -  person Ignacio Vazquez-Abrams    schedule 21.06.2011
comment
Если вы запускаете ядра на графическом процессоре с X11, вы не сможете запустить отладчик. Кроме того, при работе на том же графическом процессоре, если ядро, над которым вы работаете, зависает, X11 также зависает, вызывая блокировку дисплея.   -  person dwelch91    schedule 21.06.2011
comment
Разве тот, на котором работает X11, не тот, у которого подключен дисплей? У нее должно быть ограничение времени работы ядра (что вы можете проверить в свойствах устройства), в то время как у другой карты не должно быть ограничения времени работы (я думаю, что это справедливо и для Linux, а не только для Windows).   -  person jmsu    schedule 21.06.2011


Ответы (2)


В структуре 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 является выделенным вычислительным устройством.

person talonmies    schedule 28.07.2011

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

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

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

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

person CygnusX1    schedule 21.06.2011