2016-08-04 6 views
1

Я прочитал this description API-интерфейса OpenCL 2.x и провел через Pipe API pages на khronos.org. Я чувствовал себя завистливо, работая в CUDA почти исключительно, этой отличной функции, доступной только в OpenCL (и жаль, что функциональность CUDA не была должным образом включена OpenCL, но это другая проблема), поэтому я подумал, что спрошу «Как CUDA не имеет трубчатого механизма ». Но потом я понял, что даже не знаю, что это будет означать. Итак, вместо этого я попрошу:Трубы OpenCL 2.x - как они на самом деле работают?

  1. Как работают трубы OpenCL на дискретных GPU AMD/APU? ...

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

ответ

2

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

+0

Я бы добавил, что эмуляция труб на CUDA довольно тривиальна с глобальным буфером, буфером резервирования и атомикой. Кроме того, я считаю, что каналы AMD используют локальную память для буферов резервирования. –

+0

@JohnsPaul: «Лучшее соотношение кэш-памяти» - вы имеете в виду кеш-память L2 или кеш-память L1, специфичную для ядра? И - это графические процессоры AMD или их драйверы, способные «отдать предпочтение» потребителям труб из того же ядра, что и последние данные о трубках, переданных по потребителям на других ядрах, чтобы использовать кеш L1? – einpoklum

+0

@AndreasPapadopoulos: 1. Это может быть не так уж и просто, чтобы не жертвовать производительностью из-за синхронизации с использованием атомистики. 2. Как будет работать локальная память для буфера резервирования, если необходимо, чтобы рабочие группы на разных ядрах делали оговорки? – einpoklum