Мне нужно реализовать алгоритм суммы префикса и потребовать его как можно быстрее. Пример:
[3, 1, 7, 0, 4, 1, 6, 3]
should give
[3, 4, 11, 11, 15, 16, 22, 25]
Есть ли способ сделать это, используя инструкцию SSE/mmx/SIMD cpu?
Моя первая идея состоит в том, чтобы суммировать каждую пару параллельно рекурсивно, пока вся сумма не будет вычислена, как показано ниже!
//in parallel do
for (int i = 0; i<z.length; i++){
z[i] = x[i<<1] + x[(i<<1)+1];
}
Чтобы сделать алгоритм немного более понятным, "z" не является окончательным выходом
но вместо этого используется для вычисления вывода
int[] w = computePrefixSum(z);
for (int i = 1; i<ouput.length; i++){
ouput[i] = (i%2==0) ? (x[i] + ouput[i-1]) : w[(i-1)>>1];
}