Программа Openmp работает без критического раздела - PullRequest
0 голосов
/ 24 февраля 2019

В лекции Openmp подобный код показан как условие гонки в Openmp.В цикле for сумма + = не находится в критической секции, поэтому порядок выполнения потоков меняет результат.

Но в моей программе это не так.Независимо от того, как часто я запускаю эту программу, сумма всегда печатается как 285 (1² + 2² + 3² + 4² + 5² + 6² + 7² + 8² + 9²).Кажется, что в моей программе нет никаких расовых условий.

 int main()
    {
        int sum = 0;
        int a[10];
        int b[10];
        for (int counter = 0; counter < 10; counter++) {
            a[counter] = counter;
            b[counter] = counter;
        }


#pragma omp parallel for shared(sum)
    for (int i = 0; i < 10; i++) {
        sum += a[i] * b[i];  
    }
    cout << "sum is " << sum; // always prints 285
    std::cin.get();
    return 0;
}

В лекции конкретно сказано, что эта программа не должна выводить правильную сумму.Чтобы исправить это, они говорят нам использовать либо #pragma omp critical, либо reduction(+:sum)

1 Ответ

0 голосов
/ 24 февраля 2019

То, что он не показывает неправильное поведение на вашей машине с вашим компилятором и вашими параметрами компилятора, не означает, чтобез ошибок.

Различный компилятор, другой вариант оптимизации или другое аппаратное обеспечение вполне могут выявить ошибку.

Условия гонки сложны в том, что часто они фактически не проявляются как проблемы (за исключением месяцев послепроизводство у вашего крупнейшего клиента поздно ночью) во многих случаях или во многих конфигурациях.Расовые условия по-прежнему являются ошибками и неопределенным поведением (что означает, что вашему компилятору разрешено предполагать, что его там нет, и он может фактически использовать это предположение и в результате слегка искажать другие части вашей программы).

Факт заключается в том, что когда несколько потоков изменяют одну и ту же переменную (или некоторые изменяют, а некоторые читают), вам необходимо для синхронизации доступа к общей переменной - всегда - чтобы бытьРаса свободна.

...