Недавно я начал работать с OpenCL на C++ и пытаюсь полностью понять, как использовать 2D и 3D NDRange. В настоящее время я реализую взвешивание обратного расстояния в OpenCL, но моя проблема носит общий характер.
Ниже приведена последовательная функция для вычисления весов, состоящая из вложенного цикла.
void computeWeights(int nGrids, int nPoints, double *distances, double *weightSum, const double p) {
for (int i = 0; i < nGrids; ++i) {
double sum = 0;
for (int j = 0; j < nPoints; ++j) {
double weight = 1 / pow(distances[i * nPoints + j], p);
distances[i * nPoints + j] = weight;
sum += weight;
}
weightSum[i] = sum;
}
}
Я хотел бы реализовать вышеуказанную функцию с использованием 2D NDRange, первый из которых находится над nGrids, а второй - над nPoints. Однако я не понимаю, как обрабатывать суммирование весов в weightSum[i]. Я понимаю, что мне, возможно, придется каким-то образом использовать параллельное сокращение суммы.