У меня есть этот код, который работал много лет (и по-прежнему работает при использовании некоторых случайных компиляторов).Неверный результат с openMP reduction pragma
То, что мы ожидаем, должно иметь тот же результат в последовательном и параллельном исполнении.
Симптом заключается в том, что при каждом выполнении параллельное выполнение дает другой результат.
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i, N, j, sum;
int ** A;
sum=0;
N=1000;
A=(int**)malloc(N*sizeof(int*));
for (i=0;i<N;i++) {
A[i] = (int*)malloc(N *sizeof(int));
}
for (i=0; i<N; ++i) {
for (j=0; j<N; ++j) {
A[i][j]=i+j;
sum+=A[i][j];
}
}
printf("Total sum = %d \n",sum);
sum=0;
#pragma omp parallel for reduction(+:sum)
for (i=0; i<N; ++i) {
for (j=0; j<N; ++j) {
sum += A[i][j];
}
}
printf("Total sum = %d \n",sum);
for (i=0;i<N;i++){ free(A[i]);}
free(A);
return 0;
}
Мы скомпилировать его так:
gcc -fopenmp reduction.c
И запустить его так:
./a.out
Total sum = 999000000
Total sum = 822136991
Он работает с МЦХ.
Редактировать: если мы используем оптимизацию -O3 с Gcc, она также работает.
Используйте этот '#pragma OMP параллельно для восстановления (+: сумма) частное (J)'. –
@ Zboson спасибо, кажется правильным. Если вы создадите ответ, я приму его. –