Как решить проблему С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 шт):
Программа работает некорректно из-за того, что Вы ее некорректно написали. Вот Вы в параллельной секции выполняете такую операцию: 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 с указанным числом знаков после десятичного разделителя.
