Я пытаюсь реализовать алгоритм суммирования префиксов в C, используя OpenMP, и я застрял.
#include <stdlib.h>
#include <stdio.h>
#include <omp.h>
int main(int argc, char* argv[])
{
int p = 5;
int X[5] = { 1, 5, 4, 2, 3 };
int* Y = (int*)malloc(p * sizeof(int));
for (int i = 0; i < p; i++)
printf("%d ", X[i]);
printf("\n");
Y[0] = X[0];
int i;
#pragma omp parallel for num_threads(4)
for (i = 1; i < p; i++)
Y[i] = X[i - 1] + X[i];
int k = 2;
while (k < p)
{
int i;
#pragma omp parallel for
for (i = k; i < p; i++)
Y[i] = Y[i - k] + Y[i];
k += k;
}
for (int i = 0; i < p; i++)
printf("%d ", Y[i]);
printf("\n");
system("pause");
return 0;
}
Что должен делать этот код?
Ввод числа в X
,
вывод числа (префиксы) в Y
и число равно p
.
X = 1, 5, 4, 2, 3
Стадия I.
Y[0] = X[0];
Y[0] = 1
Этап II.
int i;
#pragma omp parallel for num_threads(4)
for (i = 1; i < p; i++)
Y[i] = X[i - 1] + X[i];
Пример:
Y[1] = X[0] + X[1] = 6
Y[2] = X[1] + X[2] = 9
Y[2] = X[2] + X[3] = 6
Y[4] = X[3] + X[4] = 5
Стадия III. (где я застрял)
int k = 2;
while (k < p)
{
int i;
#pragma omp parallel for
for (i = k; i < p; i++)
Y[i] = Y[i - k] + Y[i];
k += k;
}
Пример:
k = 2
Y[2] = Y[0] + Y[2] = 1 + 9 = 10
Y[3] = Y[1] + Y[3] = 6 + 6 = 12
Y[4] = Y[2] + Y[4] = 10 + 5 = 15
Над10 + 5 = 15
должно быть 9 + 5 = 14
, но Y[2]
был перезаписан другим потоком.Я хочу использовать это Y[2]
, что было до запуска цикла for.
Пример:
k = 4
Y[4] = Y[0] + Y[4] = 1 + 15 = 16
Результат: 1, 6, 10, 12, 16
. Ожидаемый хороший результат: 1, 6, 10, 12, 15
.