Я прочитал this description API-интерфейса OpenCL 2.x и провел через Pipe API pages на khronos.org. Я чувствовал себя завистливо, работая в CUDA почти исключительно, этой отличной функции, доступной только в OpenCL (и жаль, что функциональность CUDA не была должным образом включена OpenCL, но это другая проблема), поэтому я подумал, что спрошу «Как CUDA не имеет трубчатого механизма ». Но потом я понял, что даже не знаю, что это будет означать. Итак, вместо этого я попрошу:Трубы OpenCL 2.x - как они на самом деле работают?
Как работают трубы OpenCL на дискретных GPU AMD/APU? ...
- Какая информация написана где?
- Каким образом планирование рабочих групп ядра на ядрах осуществляется с помощью труб?
- Нужно ли скомпилировать ядра (например, их СПИР)?
- Использует ли использование труб возможность передачи данных между различными ядрами через кэш-память ядра («локальная память» в OpenCL-языке, «разделяемая память» на языке CUDA)? Это было бы круто.
- Есть ли способ, которым трубы «предполагается» работать на графическом процессоре, в общем? то, что авторы API предполагали или даже писали?
- Как работают трубы OpenCL в реализациях OpenCL на основе процессора?
Я бы добавил, что эмуляция труб на CUDA довольно тривиальна с глобальным буфером, буфером резервирования и атомикой. Кроме того, я считаю, что каналы AMD используют локальную память для буферов резервирования. –
@JohnsPaul: «Лучшее соотношение кэш-памяти» - вы имеете в виду кеш-память L2 или кеш-память L1, специфичную для ядра? И - это графические процессоры AMD или их драйверы, способные «отдать предпочтение» потребителям труб из того же ядра, что и последние данные о трубках, переданных по потребителям на других ядрах, чтобы использовать кеш L1? – einpoklum
@AndreasPapadopoulos: 1. Это может быть не так уж и просто, чтобы не жертвовать производительностью из-за синхронизации с использованием атомистики. 2. Как будет работать локальная память для буфера резервирования, если необходимо, чтобы рабочие группы на разных ядрах делали оговорки? – einpoklum