C OpenMP-код неожиданно работает на Cygwin, но так же, как и ожидалось в Linux - PullRequest
0 голосов
/ 10 декабря 2018
int a = 0;
#pragma omp parallel private(a)
{
    a++;
    printf("%d", a);
}

С 4 ядрами можно ожидать, что этот кусок кода напечатает 1111, что он делает на моем компьютере с Linux.

Однако, при запуске того же куска кода (те же флаги и т. Д.) В cygwin намоя машина с Windows приводит к 11117 (не уверен насчет числа 1).

7 всегда есть, и у друга, который пробовал то же самое, тоже была 7, Есть идеи, как это происходит?

Я скомпилировал код с помощью "gcc source.c -fopenmp -O2" на обеих машинах.

1 Ответ

0 голосов
/ 10 декабря 2018

Мне было трудно воспроизвести вашу ошибку, поскольку, как я уже упоминал в своем комментарии, ваш код имеет неопределенное поведение со стандартной точки зрения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...