我一直在尝试使用OpenMP并行化以下代码,但没有成功。
我在互联网上搜索了几个示例,但在多次执行该程序后,没有一个给我相同的答案。

#include <stdio.h>
#include <omp.h>
#define NUM_THREADS 2

long num_steps = 100000;
double step    = 1.0/100000.0;

int main() {
int i;
double x, pi, sum = 0.0;
for(i = 0; i < num_steps; ++i) {
 x = (i-0.5)*step;
 sum += 4.0/(1.0+x*x);
}
pi = step*sum;
printf("PI value = %f\n", pi);


}

这是我到目前为止的解决方案:

int main (int argc, char **argv){

//Variables
int i=0, aux=0;
double step = 1.0/100000.0;
double  x=0.0,
        pi=0.0,
        sum = 0.0;

 #pragma omp parallel  shared(sum,i) private(x)
 {
    x = 0.0;
    sum = 0.0;

    #pragma omp for
    for (i=0; i<num_steps; ++i) {
        x = (i-0.5)*step;

        #pragma omp critical
        sum += 4.0/(1.0+x*x);

    }
 }

 /* All threads join master thread and terminate */
 pi= step*sum;
 printf("PI value = %f\n", pi);
}

最佳答案

请考虑使用与OpenMP官方网站中提到的循环相同的指令:loop parallelism,我不得不更改您的代码中的许多行,我的目标不是给您代码的空洞,但我认为作为帮助/教程,然后我发布完整程序。希望这将是您开始熟悉C语言中的OpenMP和循环并行性的起点。

#include <stdio.h>
#include <omp.h>
#define NUM_STEPS 10000000

int main (int argc, char **argv){

//Variables
long int i, num_steps = NUM_STEPS;
double x, step, sum, pi;
sum = 0.0;
step = 1.0 / (double) num_steps;
 #pragma omp parallel private(i,x)
 {
  #pragma omp for reduction(+:sum)
    for (i=0; i<num_steps; ++i) {
        x = (i+0.5)*steps;
        sum += 4.0/(1.0+x*x);

    }
 }

 /* All threads join master thread and terminate */
 pi= steps*sum;
 printf("PI value = %.24f\n", pi);

关于c - OpenMP Parallelize Pi程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40171162/

10-14 14:48