大家好。我想用
#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;
}

由于您编写错误,该程序无法正常运行。在这里,您在并行部分执行以下操作:
numberPi += 4.0 / (1.0 + temp * temp);- 编译器应该如何理解这一点?您是否希望每个线程在循环体中创建自己的变量副本numberPi?正确的值应该存储在哪个线程中?答案肯定是没有。你必须告诉编译器这个变量是用来对所有线程的数据求和的。为此,OpenMP 有一个reduction指示操作的关键字:#pragma omp parallel num_threads(8) reduction(+:numberPi). 你可以在这里指定,你可以在pragma中用循环的描述。结果应该是这样的:在这种形式下,当在 Mingw-w64 中编译时,程序可以正常工作,因为它
pi在小数点分隔符后打印具有指定位数的数字。