Размеры рабочих групп

Почему для данного ядра рабочие_группы всегда имеют одинаковый размер? Я где-то читал (для случая, когда мы не указываем локальный рабочий размер), что openCL создает 3 рабочие группы (по 217 рабочих элементов в каждой) для ядра с 651 рабочим элементом (делится на 3), в то время как он создает 653 рабочих -группы по 1 рабочему элементу в каждой, так как 653 - простое число.

Предположим, мы указываем local_work_size (то есть количество рабочих элементов в рабочей группе), скажем, 5. И мы дали общее количество рабочих элементов (global_work_size) как 9. Как будут создаваться рабочие группы? поэтому global_work_size должен быть кратным local_work_size? Если для данных требуется только 9 рабочих элементов, как мне увеличить их до 10 (кратно local_work_size, 5)?

Почему хост не может выделить память для массива результатов, если он не знает, сколько рабочих групп будет выполнять ядро?

Пожалуйста помоги. Я прочитал все это здесь: http://www.openclblog.com/2011/09/work-group-sizes.html


person Remy    schedule 13.07.2012    source источник


Ответы (1)


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

Давайте рассмотрим пару примеров;

A) Масштабируйте изображение от N на M до X на Y.

Б) Суммируйте N чисел.

Для)

Очевидный размер глобальной рабочей группы - X, Y, 1. Почему? Это дает 1 поток на пиксель выхода. Размер локальной рабочей группы следует выбирать на основе количества входных пикселей, которые необходимо обработать для создания выходного пикселя.

Eg.

A.1) Масштабирование изображения с 4K на 3,2K до 64 на 64. Размер GWG [64,64,1] Размер LWG 256 A.2) Масштабирование изображения с 4k на 3,2k до 800 на 600. Размер GWG [800 , 60,1] LWG Размер 256

Для B)

Очевидный размер глобальной рабочей группы N / 2,1,1. Почему? Таким образом, каждый поток начинается с суммирования двух значений. Локальная рабочая группа должна быть установлена ​​на устройство макс.

Есть некоторые предостережения;

1) Размер глобальной рабочей группы ограничен размером глобальной памяти и максимальным размером выделения глобальной памяти.

2) Каждое устройство имеет максимальный размер локальной рабочей группы, часто 256

person Tim Child    schedule 14.07.2012
comment
Спасибо, Тим !! Спасибо за ответ. :) Итак, размер GWG не должен быть кратным размеру LWG ?? - person Remy; 15.07.2012
comment
Чтобы уточнить, да, размер LWG должен быть кратным или нулевым. На страницах руководства khronos.org/registry/cl/sdk /1.1/docs/man/xhtml - person Tim Child; 15.07.2012
comment
Поскольку размер GWG связан с размером проблемы (предположим, при сопоставлении с образцом, я беру (Length_of_text) - (Length_of_pattern)) И я беру размер LWG как Length_of_pattern (всего 1 слово). Но ЕСЛИ размер GWG не кратен LWG, и поскольку он должен быть кратным, я не могу принять LWG как Length_of_pattern. Как мне тогда передать Pattern в __Local? - person Remy; 16.07.2012
comment
Вы не можете передавать данные как __local. Вы можете передать данные как глобальные, а некоторые потоки скопируют их в локальные. Если размер GWG не кратен размеру LWG, сделайте его следующим по величине кратным и передайте константу, которая является размером проблемы или количеством потоков. Например. передать N как константу int и проверить, если (N ‹get_global_id (0)) ... - person Tim Child; 16.07.2012
comment
Если шаблон неизменен (не меняется) во время выполнения ядра, вы можете передать его как постоянный аргумент. Обычно это быстрее на графическом процессоре. - person Tim Child; 17.07.2012