Редукция OpenCL - 2D матрица в одномерный массив

У меня есть двумерный массив размером MxN, где N - это степень 2, которая больше или равна 16, а M - произвольное целое число, которое не является степенью 2. Например, размер массива A может быть 200x32.

Я хотел бы уменьшить массив A до размера 1x32, выполнив операцию уменьшения (добавления) по строкам массива. Большинство сокращений, с которыми я сталкивался, сводят массив к одному значению, добавляя последовательные элементы, используя алгоритм сканирования Blelloch/Hillis. В моем случае, однако, последовательные элементы не связаны и не могут быть добавлены. Однако мне нужно добавить элементы [1, 33, 65...] и элементы [2,34,66..] и так далее.

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

1 ответ

Это объединяется:

WorkItem1 -> 1 + 33 + 65 + ...
WorkItem2 -> 2 + 34 + 66 + ...
WorkItem3 -> 3 + 35 + 67 + ...
...

Как видите, все операции с памятью в группе потоков выполняются в смежных областях памяти.

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

Другие вопросы по тегам