Большой глобальный размер OpenCL или циклы для каждого рабочего элемента?

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

Реализация предназначена для графического процессора Mali T-6xx.

Я прочитал книгу «Программирование OpenCL на примерах» и документ «Оптимизация ядер OpenCL на графических процессорах Mali-T600».

В примерах книги они используют некоторый глобальный размер рабочих элементов, и каждый рабочий элемент обрабатывает несколько пикселей в циклах for.

В документе ядра написаны без циклов, так как каждый рабочий элемент в ядре выполняется один раз.

Поскольку максимальный глобальный размер рабочих элементов, которые можно создать на графических процессорах Mali T-600, составляет 256 (и это для простых ядер). И в большинстве изображений для обработки явно больше пикселей, в моем понимании ядро ​​без циклов будет создаваться. больше потоков рабочих элементов как можно скорее, пока глобальный размер рабочих элементов не завершит выполнение ядра, а глобальный размер может быть просто количеством пикселей в изображении. Это правильно? Так что это своего рода цикл порождения потока сам по себе?

С другой стороны в кн. Общий рабочий размер меньше, чем количество обрабатываемых пикселей, но в ядре есть циклы, которые заставляют каждый рабочий элемент обрабатывать несколько пикселей при выполнении кода ядра.

Поэтому я хочу знать, какой способ является правильным для написания ядер обработки изображений или любых ядер OpenCL, если на то пошло, и в каких ситуациях один способ может быть лучше, чем другой, при условии, что я правильно понял оба способа...


person Zimgir    schedule 08.05.2016    source источник


Ответы (1)


Это правильно? Так что это своего рода цикл порождения потока сам по себе?

да.

Поэтому я хочу знать, как правильно писать ядра обработки изображений или любые ядра OpenCL, если уж на то пошло, и в каких ситуациях

Я подозреваю, что в целом нет «правильного» ответа — существует несколько поставщиков оборудования и несколько драйверов, поэтому я подозреваю, что «лучший» подход будет варьироваться от поставщика к поставщику.

В частности, для Mali порождение потока обрабатывается аппаратно, поэтому в целом это будет быстрее, чем явные циклы в коде шейдера, для обработки которых требуются инструкции.

Обычно есть некоторое преимущество, по крайней мере, в некоторой векторизации - например. обработка векторов пикселей vec4 или vec8 на рабочий элемент, а не только 1, поскольку ядра графического процессора Mali-T600/700/800 используют архитектуру векторной арифметики.

person solidpixel    schedule 08.05.2016