Как решить проблему С6993 в С++ при использований OpenMP?

Всем привет. Я хочу использовать

#pragma omp for

Но во время написаний кода у меня постоянно возникает это ошибка.

введите сюда описание изображения

Из за этой ошибки у меня программа работает некорректно. Как решить эту проблему? В гугле не нашел точного ответа. Помогите пожалуйста. Полный код снизу:

#include <iostream>
#include <omp.h>
#include <iomanip>

#define N 1000000

int main()
{
    setlocale(LC_ALL, "Russian");

    long long number;
    std::cout << "Введите число: ";
    std::cin >> number;

    long double count = 0;
    while (number > 0)
    {
        number /= 10;
        count++;
    }

    long double numberPi = 0;
    long double temp;

#pragma omp parallel num_threads(8)
    {
#pragma omp for
        for (long long i = 0; i < N; i++)
        {
            temp = (i + 0.5) * (1.0 / N);
            numberPi += 4.0 / (1.0 + temp * temp);
        }
    }
    std::cout.precision(count - 1);
    std::cout << "number Pi: " << numberPi * (1.0 / (N)) << std::endl;
    std::cout << "count: " << count << std::endl;
    
    return 0;
}

Ответы (1 шт):

Автор решения: Vladimir

Программа работает некорректно из-за того, что Вы ее некорректно написали. Вот Вы в параллельной секции выполняете такую операцию: numberPi += 4.0 / (1.0 + temp * temp); - как компилятор должен это понять? Вы хотите, чтобы в теле цикла для каждого потока создавалась своя копия переменной numberPi? И в каком из Ваших потоков должно храниться верное значение? Ответ - точно ни в каком одном. Вы должны указать компилятору, что эта переменная предназначена для суммирования данных из всех потоков. Для этого в OpenMP есть ключевое слово reduction с указанием операции: #pragma omp parallel num_threads(8) reduction(+:numberPi). Можно указать здесь, можно в прагме с описанием цикла. В итоге должно получиться что-то такое:

#include <iostream>
#include <omp.h>
#include <iomanip>

#define N 1000000

int main()
{
    setlocale(LC_ALL, "Russian");

    long long number;
    std::cout << "Введите число: ";
    std::cin >> number;

    long double count = 0;
    while (number > 0)
    {
        number /= 10;
        count++;
    }

    long double numberPi = 0;
    long double temp;

#pragma omp parallel num_threads(8)  reduction(+:numberPi)
    {
#pragma omp for 
        for (long long i = 0; i < N; i++)
        {
            temp = (i + 0.5) * (1.0 / N);
            numberPi += 4.0 / (1.0 + temp * temp);
        }
    }
    std::cout.precision(count - 1);
    std::cout << "number Pi: " << numberPi * (1.0 / (N)) << std::endl;
    std::cout << "count: " << count << std::endl;
    
    return 0;
}

В таком виде, при сборке в Mingw-w64 программа работает правильно, в смысле, печатает число pi с указанным числом знаков после десятичного разделителя.

→ Ссылка