Как CUDA назначает идентификаторы устройств для графических процессоров?

Когда компьютер имеет несколько графических процессоров с поддержкой CUDA, каждому графическому процессору назначается device ID. По умолчанию ядра CUDA выполняются на device ID 0. Вы можете использовать cudaSetDevice(int device) для выбора другого устройства.

Скажем, у меня в машине два графических процессора: GTX 480 и GTX 670. Как CUDA определяет, какой графический процессор device ID 0 и какой графический процессор device ID 1?


Идеи о том, как CUDA может назначать идентификаторы устройств (просто мозговой штурм):

  • убывающий способ вычисления возможностей
  • Номер слота PCI
  • дата/время, когда устройство было добавлено в систему (устройство, которое было добавлено на компьютер, - это более высокий идентификационный номер)

Мотивация. Я работаю над некоторыми алгоритмами HPC, и я сравниваю и автонастраиваю их для нескольких графических процессоров. В моем процессоре достаточно полос PCIe для управления cudaMemcpys до 3 графических процессоров с полной пропускной способностью. Таким образом, вместо постоянной замены графических процессоров на моей машине и из нее, я планирую просто сохранить 3 графических процессора на своем компьютере. Я хотел бы иметь возможность предсказать, что произойдет, когда я добавлю или замените некоторые графические процессоры на компьютере.

Ответы

Ответ 1

CUDA выбирает самое быстрое устройство как устройство 0. Поэтому, когда вы меняете местами графические процессоры, вы можете полностью изменить порядок. Возможно, лучше выбрать GPU на основе их идентификатора шины PCI, используя:

cudaError_t cudaDeviceGetByPCIBusId ( int* device, char* pciBusId )
   Returns a handle to a compute device.

cudaError_t cudaDeviceGetPCIBusId ( char* pciBusId, int  len, int  device )
   Returns a PCI Bus Id string for the device.

или API-интерфейс драйвера CUDA cuDeviceGetByPCIBusId cuDeviceGetPCIBusId.

Но ИМО - самый надежный способ узнать, какое устройство будет использовать NVML или nvidia-smi, чтобы получить уникальный идентификатор устройства (UUID) с помощью nvmlDeviceGetUUID, а затем сопоставить его с CUDA-устройством с помощью pciBusId с помощью nvmlDeviceGetPciInfo.

Ответ 2

Задайте переменную окружения CUDA_DEVICE_ORDER как:

export CUDA_DEVICE_ORDER=PCI_BUS_ID

Затем идентификаторы GPU будут упорядочены идентификаторами шины pci.

Ответ 3

Поддержка CUDA/выбор графического процессора позволяют предположить, что

при запуске программы CUDA на компьютере с несколькими графическими процессорами, по умолчанию ядра CUDA будут выполняться на любом GPU, установленном в гнезде основной видеокарты.

Кроме того, обсуждение на Нет графического процессора, код работает правильно, как это возможно? предполагает, что CUDA не отображает "лучшую" карту к устройству 0 в целом.

ИЗМЕНИТЬ

Сегодня я установил ПК с картой Tesla C2050 для вычисления и 8084 GS-карту для визуализации, переключая их положение между двумя первыми слотами PCI-E. Я использовал deviceQuery и заметил, что GPU 0 всегда в первом слоте PCI, а GPU 1 всегда во втором слоте PCI. Я не знаю, является ли это общим утверждением, но это доказательство того, что для моих системных графических процессоров нумеруются не по их "мощности", а по их позициям.