2016-09-20 2 views
1

Так что я довольно новичок в OpenCL, и я стараюсь лучше понимать рабочие группы и рабочие элементы. Я понимаю, что все потоки (элементы) внутри одной группы обмениваются памятью, атомарными операциями и барьерной синхронизацией.OpenCL: Идеальный # блоков, когда только заботится о глобальном идентификаторе потока?

Однако что делать, если я не нужны эти льготы и заботятся только о глобальном ID любого данного потока ?:

get_global_id(0) 

Как же тогда я должен идти выбирать, сколько групп и сколько пунктов каждая группа должна если все, что мне нужно, это общее количество потоков? (= группы * элементов на группу)

Например, скажем, у меня есть программа для вычисления матрицы 400x400. У меня 160 000 потоков. Изначально я думал (наивно), давайте вставляем их все в один блок, однако это было выше допустимого предела потоков на блок. Итак, я выбираю произвольное количество блоков: 1600 с 100 потоками на блок. Мое ускорение в среднем составляло x5.5 от CPU с одним потоком (у меня нет хорошего графического процессора для запуска моего кода еще ...). Итак, я понял, так как я не могу использовать блоки, почему бы не дать каждой отдельной ветке собственный блок? Мое ускорение в среднем составляло x4.5. Так что медленнее давать каждому потоку собственный блок.

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

+0

Не могли бы вы поделиться своим кодом, пожалуйста? Является ли это добавлением или умножением матрицы или некоторым другим? Вы можете изменить свой код, чтобы обрабатывать другую матрицу для каждой группы, так что, возможно, параллелизм матричного уровня может быть выполнен? –

ответ

2

Один из вариантов - дать NULL параметру local_work_size параметра clEnqueueNDRangeKernel, и в этом случае реализация OpenCL сама определит местный размер. Это может не дать оптимального результата, но, по крайней мере, реализация OpenCL попытается угадать оптимальный локальный размер.

Кроме того, clGetKernelWorkGroupInfo может использоваться для запроса CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE.

+0

Спасибо за помощь, сэр! – danglingPointer

Смежные вопросы