OpenCL только одно устройство в платформе - PullRequest
0 голосов
/ 01 ноября 2018

Я изучаю OpenCL с самого начала, и меня смущает идея platform = host + device . На моем рабочем ПК обнаружено 2 платформы: на платформе 0 установлен только процессор, на платформе 1 - только графический процессор NVIDIA. Обнаруженные платформы

Этот ПК на самом деле также имеет графический процессор Intel, но я предполагаю, что он не поддерживает OpenCL, поэтому он не отображается здесь. Мой вопрос звучит так: в приложении OpenCL есть хост и устройство. Обычно хост и устройство приходят с одной платформы в соответствии с моим пониманием из книги. Затем в моем ПК мне нужно использовать либо процессор, либо графический процессор NVIDIA в качестве хоста и устройства для приложения OpenCL. Это правда?

Я пытался искать самостоятельно, некоторые ответы действительно помогают мне понять больше в этой теме, например: Что такое хост в opencl? . Но об использовании одного оборудования как для хоста, так и для устройства мой поиск не получил ответа или подтверждения.

1 Ответ

0 голосов
/ 01 ноября 2018

Я думаю, что вы перепутали некоторую терминологию здесь.

  • Хост - это обычная программа, выполняемая на самом процессоре.
  • Платформы предоставляются драйверами OpenCL, представляющими набор устройств и функций.
  • Устройства являются базовым оборудованием, которое может использоваться для OpenCL, предоставляемым платформой.

Платформа может предоставлять несколько разных устройств: например, если у вас установлен драйвер Nvidia OpenCL, она предоставляет устройство OpenCL для каждого поддерживаемого графического процессора. Между тем, драйвер Intel предоставляет процессор Intel в качестве устройства OpenCL.

Обычно поток вашей программы будет выглядеть примерно так:

  1. Поиск платформ OpenCL с использованием clGetPlatformIds
  2. Найдите устройства OpenCL, использующие clGetDeviceIds для любой платформы, которую вы хотите использовать.
  3. Создайте контекст OpenCL, программу, очередь команд и ядро, используя clCreateContext, clCreateProgram и т. Д.
  4. Скопируйте необходимые данные в буферы или параметры ядра.
  5. Запустить ядро ​​на одном или нескольких устройствах, используя clEnqueueNDRangeKernel.
  6. Копировать данные обратно из буферов
...