Каналы OpenCL 2.x - как они на самом деле работают?
Я прочитал это описание API-канала OpenCL 2.x и провел по страницам API-интерфейса Pipe на khronos.org. Я немного завидовал, работая почти исключительно в CUDA, этой изящной функции, доступной только в OpenCL (и сожалею, что функциональность CUDA не была должным образом отнесена к OpenCL, но это другая проблема), поэтому я подумал: "Как У CUDA нет трубного механизма ". Но потом я понял, что даже не знаю, что это будет означать. Поэтому вместо этого я спрошу:
Как работают каналы OpenCL на дискретных графических процессорах / APU AMD?...
- Какая информация пишется где?
- Каким образом планирование рабочих групп ядра для ядер зависит от использования каналов?
- Собираются ли вместе конвейерные ядра (скажем, их формы SPIR)?
- Позволяет ли использование каналов передавать данные между разными ядрами через кэш, специфичный для ядра ("локальная память" на языке OpenCL, "разделяемая память" на языке CUDA)? Это было бы круто.
- Есть ли способ, по которому трубы должны "работать" на GPU? то есть что-то, что авторы API предусмотрели или даже написали в письменной форме?
- Как работают каналы OpenCL в процессорных реализациях OpenCL?
1 ответ
Трубы OpenCL были представлены вместе с OpenCL 2.0. В графических процессорах каналы OpenCL подобны глобальному буферу памяти с контролируемым доступом, т.е. вы можете ограничить число рабочих групп, которым разрешено одновременно выполнять запись / чтение в / из канала. Этот вид позволяет нам повторно использовать один и тот же буфер или канал, не беспокоясь о конфликтах чтения или записи из нескольких рабочих групп. Насколько я знаю, OpenCL-каналы не используют локальную память графического процессора. Но если вы тщательно отрегулируете размер канала, вы можете увеличить попадания в кэш, что приведет к повышению общей производительности. Нет общего правила относительно того, когда следует использовать трубы. Я использую каналы для передачи данных между двумя одновременно работающими ядрами, чтобы моя программа достигла лучшей общей производительности благодаря лучшему коэффициенту попадания в кэш. Это аналогично тому, как каналы OpenCL работают и в CPU (это просто глобальный буфер, который может поместиться в системный кеш, если он достаточно мал). Но на таких устройствах, как ПЛИС, они работают по-другому. Каналы используют локальную память вместо глобальной памяти в этих устройствах и, следовательно, достигают значительно более высокой производительности по сравнению с использованием буфера глобальной памяти.