Каналы OpenCL 2.x - как они на самом деле работают?

Я прочитал это описание API-канала OpenCL 2.x и провел по страницам API-интерфейса Pipe на khronos.org. Я немного завидовал, работая почти исключительно в CUDA, этой изящной функции, доступной только в OpenCL (и сожалею, что функциональность CUDA не была должным образом отнесена к OpenCL, но это другая проблема), поэтому я подумал: "Как У CUDA нет трубного механизма ". Но потом я понял, что даже не знаю, что это будет означать. Поэтому вместо этого я спрошу:

  1. Как работают каналы OpenCL на дискретных графических процессорах / APU AMD?...

    • Какая информация пишется где?
    • Каким образом планирование рабочих групп ядра для ядер зависит от использования каналов?
    • Собираются ли вместе конвейерные ядра (скажем, их формы SPIR)?
    • Позволяет ли использование каналов передавать данные между разными ядрами через кэш, специфичный для ядра ("локальная память" на языке OpenCL, "разделяемая память" на языке CUDA)? Это было бы круто.
  2. Есть ли способ, по которому трубы должны "работать" на GPU? то есть что-то, что авторы API предусмотрели или даже написали в письменной форме?
  3. Как работают каналы OpenCL в процессорных реализациях OpenCL?

1 ответ

Трубы OpenCL были представлены вместе с OpenCL 2.0. В графических процессорах каналы OpenCL подобны глобальному буферу памяти с контролируемым доступом, т.е. вы можете ограничить число рабочих групп, которым разрешено одновременно выполнять запись / чтение в / из канала. Этот вид позволяет нам повторно использовать один и тот же буфер или канал, не беспокоясь о конфликтах чтения или записи из нескольких рабочих групп. Насколько я знаю, OpenCL-каналы не используют локальную память графического процессора. Но если вы тщательно отрегулируете размер канала, вы можете увеличить попадания в кэш, что приведет к повышению общей производительности. Нет общего правила относительно того, когда следует использовать трубы. Я использую каналы для передачи данных между двумя одновременно работающими ядрами, чтобы моя программа достигла лучшей общей производительности благодаря лучшему коэффициенту попадания в кэш. Это аналогично тому, как каналы OpenCL работают и в CPU (это просто глобальный буфер, который может поместиться в системный кеш, если он достаточно мал). Но на таких устройствах, как ПЛИС, они работают по-другому. Каналы используют локальную память вместо глобальной памяти в этих устройствах и, следовательно, достигают значительно более высокой производительности по сравнению с использованием буфера глобальной памяти.

Другие вопросы по тегам