Вам нужно уменьшить, чтобы частично добавить m элементов в аннотированный массив @Local (используется для локальной памяти в aparapi). Допустим, что существует N общих элементов, поэтому вам нужны N/m частичные суммы, которым требуется более высокая пропускная способность (поэтому в локальной памяти).
Также вы должны использовать localBarrier (); для синхронизации ядер в вычислительных единицах или рабочих единицах в местных рабочих группах. Затем отправьте данные в основную память.
Очень короткий пример:
Вам нужно 1 + 2 + 3 + 4 + 5 + 6 + ..... и у вас есть 3 ядра на вычислительную единицу gpu.
1 + 2 выполняется в ядре № 1
3 + 4 выполняется в ядре номер 2
5 + 6 выполняется в ядре № 3
то вы добавляете выходы ядра в локальной памяти, которые разделяются всеми соседними ядрами этого вычислительного блока.
Наконец, вы получите 3,7,11 в массиве, который суммируется до 21 в локальной памяти.
Все эти данные всех вычислительных единиц в основной памяти, такие как 21,57, ... тогда вы можете добавить их все просто в CPU.
Конечно, будет (+/-) (1/(2 * n + 1)) вместо 1,2,3,4,5