Подтвердить что ты не робот

Как сопоставить устройства OpenCL с конкретным графическим процессором с данными PCI, идентификаторами устройств и шин в многопроцессорной системе?

Я хотел бы иметь возможность сопоставлять устройства OpenCL с графическими процессорами в системе на многопроцессорных системах, идентифицированных идентификаторами PCI.

Например, если у меня есть система с несколькими GPU, возможно, у разных поставщиков, я могу перечислить устройства, перечислив PCI-шину. Это дает мне идентификаторы PCI, устройства и шины PCI. Если я выбираю один из этих (GPU) PCI-устройств для использования для вычисления OpenCL на основе некоторых критериев выбора, как я могу сопоставить его с устройством OpenCL?

Я могу перечислять устройства GPU в OpenCL с помощью clGetDeviceID(), но нет очевидного способа сопоставления устройств OpenCL с устройствами PCI. Функция OpenCL clGetDeviceInfo() обеспечивает доступ к идентификатору поставщика и имени устройства PCI, но не к идентификаторам PCI или идентификаторам шины. Я мог бы попытаться совместить имя устройства PCI с именем устройства OpenCL, но возможно, что у вас есть более одного устройства того же типа, и имена не всегда одинаковы.

Почему это необходимо? Скажем, я знаю, что программа X запускает CUDA или что-то еще на GPU A. Я хочу избежать использования GPU A для работы OpenCL, поэтому я выбираю GPU B. Затем мне нужно выяснить, какое устройство OpenCL является графическим процессором A и которое является графическим процессором B. Идентификаторы PCI, по-видимому, являются единственным последовательным и кросс-платформенным способом идентификации устройств GPU.

BTW, API CUDA дает вам идентификаторы PCI, шины и слотов (CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID), но CUDA работает только с устройствами NVidia.

В идеале мне нужно решение с использованием C или С++.

4b9b3361

Ответ 1

Способ сделать это - использовать два расширения для конкретного поставщика. Для AMD вы должны использовать CL_DEVICE_TOPOLOGY_AMD, который работает в Windows и Linux, и вернет идентификатор шины PCIe, который является уникальным для графического процессора. В NVIDIA запросите устройство для CL_DEVICE_PCI_BUS_ID_NV. См. Также: https://anteru.net/2014/08/01/2483/

Ответ 2

К сожалению, ответ, который вы ищете, не очень из-за абстрактного характера openCL.

Единственный способ, с помощью которого я надежно выполнял это, - назначить требуемую рабочую нагрузку для идентификатора платформы + устройства в openCL, а затем контролировать использование процесса с помощью таких инструментов, как AMD ADL и Nvidia NVML. Даже такие зрелые приложения, как cgminer, имеют проблемы с этим и часто смешивают рабочие нагрузки openCL с показателями карты, настолько, что они назначают переменные конфигурации, чтобы исправить их вручную ( "gpu-map" ).

Я бы хотел, чтобы на данный момент был лучший ответ, потому что было бы здорово узнать через openCL, какое устройство находится за конечной точкой! Это может измениться в будущем, так как AMD работает над добавлением этого слоя в openCL, как указал арсенс.

Ответ 3

В последней версии AMD есть расширение cl_device_topology_amd для Linux, которое добавляет параметр CL_DEVICE_TOPOLOGY_AMD в clGetDeviceInfo(), но это довольно узкое решение.

Ответ 4

Кажется, ответ Anteru верен, но только если вы используете linux/mac. После некоторых тестов, которые я сделал, кажется, что окна не распознают эти расширения для конкретного поставщика. (Я тестировал его как на GeForce GTX Titan, так и на ATI Radeon R9)

Моим решением для вас является использование функции clGetGLContextInfoKHR() (доступной после openCL spec 1.1) с параметром "CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR", и это обеспечит вам получение идентификатора устройства openCL, который соответствует тому же графическому процессору, который выполняет рендеринг.

Правда, это не даст вам слот физической шины, но это обеспечит тот же графический процессор, который отображает тот же самый графический процессор, который вычисляет!

Кроме того, предполагая, что один работает с картами Nvidia Quadro, он может использовать wgl_nv_gpu_affinity, чтобы обеспечить доступ OpenGL к определенному графическому процессору, а затем использовать контекст GL и получить от него идентификатор устройства openCL.

Ответ 5

Я разработал библиотеку, чтобы сделать это: держите синтаксис OpenCL от шага друг к другу.

Вы найдете его здесь: https://github.com/nbigaouette/oclutils/

Сначала он перечисляет все платформы и все устройства для каждой платформы, присутствующие на машине. Вы выбираете нужную платформу и выбираете лучшее из доступных устройств. Я использую его на своей рабочей станции с 3 картами nvidia: два GTX 580 для вычислений OpenCL и один GT 210 для отображения. Одновременное выполнение двух симуляций будет выполняться на двух GTX отдельно. без вмешательства.

Существует также хороший класс, который будет синхронизировать два буфера: один на хосте и один на устройстве. Вызов OpenCL_Array:: Host_to_Device() и OpenCL_Array:: Device_to_Host() делает переводы взад и вперед простыми.

Он работает с этими платформами:

  • nvidia (только для GPU)
  • amd (процессор и/или графический процессор)
  • Intel (только для CPU)
  • apple (процессор и/или графический процессор)

Обратите внимание, что он не позволит вам выбрать, какое устройство использовать, но выберите один для вас. Если два экземпляра программы используют библиотеку, они будут знать ее и не будут работать на одном устройстве (если вы тоже, конечно). В настоящее время также не удается определить, используется ли видеокарта для дисплея. Но, по крайней мере, это начало!