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

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

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

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

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

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

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


person jcoffland    schedule 01.09.2011    source источник
comment
В спецификации указано, что CL_DEVICE_VENDOR_ID может быть идентификатором PCIe. Если это не дает того, что вы хотите, то я не думаю, что в спецификации есть что-то, что будет. Тем не менее, все еще не уверен, зачем вам это нужно. Похоже на преждевременную оптимизацию.   -  person vocaro    schedule 02.09.2011
comment
@vocaro: Да, я могу получить идентификатор продавца. Не думаю, что вы понимаете вопрос.   -  person jcoffland    schedule 06.09.2011
comment
Вы говорите, что хотите узнать идентификатор устройства PCI, чтобы избежать конфликта с другим процессом, который может использовать конкретный идентификатор устройства PCI. Мне было интересно, как узнать, какие устройства PCI используются? Полагаю, вы не используете для этого OpenCL?   -  person Matt    schedule 21.01.2013


Ответы (5)


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

person Anteru    schedule 01.08.2014
comment
Я еще не пробовал, но кажется, что это правильный ответ. Замечательно, спасибо за ответ и после почти 3-х лет ожидания. - person jcoffland; 08.08.2014
comment
Извините, это заняло так много времени, раньше у меня не было проблемы :) И спасибо, что отметили это как правильный ответ. - person Anteru; 09.08.2014
comment
CL_DEVICE_PCI_BUS_ID_NV Работает ли драйвер Nvidia в Windows? Я пытаюсь сделать это в PyOpenCL, но продолжаю получать сообщение об ошибке, что это недопустимое значение. - person chippies; 07.09.2014
comment
Должен сделать, не уверен, что там происходит. К сожалению, сейчас я не могу это проверить. - person Anteru; 08.09.2014

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

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

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

person tweak2    schedule 17.02.2014

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

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

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

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

person IdanB    schedule 22.09.2014

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

person arsenm    schedule 08.09.2011
comment
Да, нужно прикрыть и карту NVidia. - person jcoffland; 10.09.2011

Я разработал библиотеку именно для этого: не позволять симуляторам 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 (только графический процессор)
  • amd (CPU и / или GPU)
  • Intel (только ЦП)
  • яблоко (CPU и / или GPU)

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

person big_gie    schedule 22.11.2011
comment
Насколько я понимаю, ваш ответ не касается проблемы сопоставления идентификаторов устройств PCI с вычислительными устройствами OpenCL. Вы решаете связанную проблему, но это не помогает в том, что мне нужно. Если я ошибаюсь, пожалуйста, объясните. Имейте в виду, что я также хочу иметь возможность использовать CUDA и при этом отслеживать, какое устройство какое. - person jcoffland; 25.10.2012