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