Как сопоставить устройства OpenCL с конкретным графическим процессором, указанным идентификатором производителя PCI, устройства и шины в системе с несколькими графическими процессорами? - PullRequest
16 голосов
/ 02 сентября 2011

Я хотел бы иметь возможность сопоставлять устройства 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 работает только с Cidia NVID), но только с CUDAустройств.

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

Ответы [ 5 ]

7 голосов
/ 01 августа 2014

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

1 голос
/ 22 сентября 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.

1 голос
/ 17 февраля 2014

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

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

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

0 голосов
/ 22 ноября 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 (только для GPU)
  • amd (CPU и / или GPU)
  • intel (только CPU)
  • apple (CPU и / или GPU)

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

0 голосов
/ 08 сентября 2011

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

...