Мне было трудно воспроизвести вашу ошибку, поскольку, как я уже упоминал в своем комментарии, ваш код имеет неопределенное поведение со стандартной точки зрения OpenMP.Действительно, переменные, которые объявлены private
при входе в область parallel
, не получают никакой инициализации, если только они не объявлены firstprivate
.
В вашем случае вы увеличиваете переменную, значение которой может быть любыми распечатайте его.Таким образом, напечатанное значение может быть любым, включая то, которое вы ожидали увидеть.
Оказалось, что для того, чтобы воспроизвести серию 1 и 7, мне пришлось скомпилировать код, отключающийлюбая оптимизация от компилятора.И как только код был исправлен с помощью firstprivate
, все результаты были равны 1 с.
До исправления:
$ gcc -O0 -fopenmp foo.c
$ OMP_NUM_THREADS=5 ./a.exe
71111
$ OMP_NUM_THREADS=5 ./a.exe
17111
Код исправлен:
#include <stdio.h>
int main () {
int a = 0;
#pragma omp parallel firstprivate(a)
{
a++;
printf("%d", a);
}
return 0;
}
Затем
$ gcc -O0 -fopenmp foo.c
$ OMP_NUM_THREADS=5 ./a.exe
11111