我在使用OpenMP时遇到了问题。MSVS编译器提示我"pragma omp atomic has improper form",但我不知道原因。代码如下(使用积分方法计算π值):
#include <stdio.h>
#include <time.h>
#include <omp.h>
long long num_steps = 1000000000;
double step;
int main(int argc, char* argv[])
{
clock_t start, stop;
double x, pi, sum=0.0;
int i;
step = 1./(double)num_steps;
start = clock();
#pragma omp parallel for
for (i=0; i<num_steps; i++)
{
x = (i + .5)*step;
#pragma omp atomic //this part contains error
sum = sum + 4.0/(1.+ x*x);
}
pi = sum*step;
stop = clock();
// some printf to show results
return 0;
}
#pragma omp reduction(+:sum)
是不正确的。编译器很可能会忽略它,并且您会遇到一个由数值不精确性隐藏的危险数据竞争。reduction
是一个子句,它必须应用于另一个OpenMP指令 - 在您的情况下是parallel for
指令。 - Hristo Iliev