Параллельность в OpenCL на 1 процессоре - PullRequest
0 голосов
/ 11 марта 2012

Можно ли достичь такого же уровня параллелизма с многоядерным устройством ЦП, как и у нескольких разнородных устройств (таких как GPU и CPU) в OpenCL?

У меня Intel i5, и я хочу оптимизировать свой код. Когда я запрашиваю платформу для устройств, я получаю только одно возвращенное устройство: процессор. Мне было интересно, как я могу оптимизировать свой код с помощью этого.

Кроме того, если бы я использовал одну очередь команд для этого устройства, будет ли приложение автоматически назначать ядра различным вычислительным устройствам или это должен делать программист вручную?

Ответы [ 3 ]

1 голос
/ 16 марта 2012

Может ли устройство с процессором достичь того же уровня параллелизма, что и процессор? Почти всегда нет.

Количество вычислительных единиц в процессоре почти всегда больше, чем в процессоре. Например, за 50 долларов можно получить видеокарту с 10 вычислительными блоками (Radeon 6450). Самые дешевые 8-ядерные процессоры на Newegg стоят 189 долларов (настольный процессор) и 269 долларов (сервер).

Вычислительные единицы процессора будут работать быстрее из-за тактовой частоты и выполнять код ветвления гораздо лучше, чем GPU. Вам нужен процессор, если в вашей рабочей нагрузке много условных выражений. GPU выполнит одни и те же инструкции для многих фрагментов данных. Для этого 6450 GPU имеет 16 «потоковых процессоров» на каждый вычислительный блок. Gpus хороши, когда вам приходится выполнять одни и те же (маленькие / средние) задачи много раз. Умножение матриц, вычисления n-boy, операции сокращения и некоторые алгоритмы сортировки работают намного лучше на оборудовании GPU / ускорителя, чем на процессоре.

Я ответил на аналогичный вопрос более подробно несколько недель назад. (Этот)

Возвращаясь к вашему вопросу о "том же уровне параллелизма" - у cpus нет такого же уровня параллелизма, как у gpus, за исключением случаев, когда gpu under выполняет выполнение реального ядра.

В вашей системе i5 будет только одно процессорное устройство. Это представляет весь процессор. Когда вы запрашиваете количество вычислительных блоков, opencl возвращает количество имеющихся у вас ядер. Если вы хотите использовать все ядра, вы просто запускаете ядро ​​на своем устройстве, и opencl будет использовать все вычислительные блоки (ядра) для вас.

0 голосов
/ 14 марта 2012

Как вы определяете количество устройств OPENCL? У меня есть ноутбук Intel I3, который дает мне 2 вычислительных блока OpenCL? Имеет 2 ядра.

Согласно спецификации Intel, I5-2300 имеет 4 ядра и поддерживает 4 потока. Это не гиперпоточный. Я ожидаю, что вызов OpenCL для запроса устройств # даст вам счет 4.

0 голосов
/ 12 марта 2012

Краткий ответ: да, он будет работать параллельно, и нет, нет необходимости делать это вручную.

Длинный ответ:

Кроме того, если бы я использовал одну очередь команд для этого устройства, приложение автоматически назначило бы ядра различным вычислительным устройствам [...]

Либо вам нужно пересмотреть свой словарь OpenCL, либо я не понял вашего вопроса. У вас есть только одно устройство и ядро! = Устройство!

Один процессор, независимо от того, сколько у него ядер, является одним устройством. То же самое касается графического процессора: один графический процессор, имеющий сотни ядер, является только одним устройством. Вы отправляете задания на устройство через очередь и драйвер устройства. Ваша работа может быть (и будет) разделена на рабочие элементы. Затем некоторые (сколько зависит от устройства / драйвера) рабочие элементы выполняются параллельно. На GPU так же, как и на CPU, один рабочий элемент выполняется одним ядром. (Это может быть не совсем верно, но это очень полезная абстракция.)

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

Цель OpenCL - позволить вам вычислять рабочие элементы параллельно, независимо от того, использует ли он несколько ядер устройств параллельно или только ядра одного устройства.

Если вас это смущает, посмотрите эти действительно хорошие (и длинные) видеоролики: http://macresearch.org/opencl

...