C OpenMP:如果循环变量不是整数(如本例所示),会发生什么情况?
#pragma omp parallel for要求循环变量为整数。那么,如果循环变量不是整数,会发生什么,如本例所示C OpenMP:如果循环变量不是整数(如本例所示),会发生什么情况?,c,openmp,C,Openmp,#pragma omp parallel for要求循环变量为整数。那么,如果循环变量不是整数,会发生什么,如本例所示 #include <stdio.h> #include <math.h> #define START (M_PI/2) #define END (M_PI*2) double f(double x) { return sin(x/2)+1; } int main(int argc, c
#include <stdio.h>
#include <math.h>
#define START (M_PI/2)
#define END (M_PI*2)
double f(double x)
{ return sin(x/2)+1;
}
int main(int argc, char *argv[])
{ double total = 0, x;
int partitions;
double slice;
printf("How many partitions? "); fflush(stdout);
scanf("%d", &partitions);
slice = (END-START)/partitions;
for (x = START + (slice/2); x < END; x = x + slice)
total = total + f(x);
total = total * slice;
printf("The integration is %1.20f\n", total);
}
#包括
#包括
#定义开始(M_PI/2)
#定义结束(M_PI*2)
双f(双x)
{返回sin(x/2)+1;
}
int main(int argc,char*argv[])
{双倍总数=0,x;
int分区;
双层切片;
printf(“有多少个分区?”);fflush(stdout);
scanf(“%d”,和分区);
slice=(结束-开始)/分区;
对于(x=开始+(切片/2);x<结束;x=x+切片)
总计=总计+f(x);
总计=总计*切片;
printf(“总积分为%1.20f\n”);
}
如何将此程序转换为OpenMP?
谢谢首先,您应该对代码的样式更加小心,尤其是缩进。代码式
for (x = START + (slice/2); x < END; x = x + slice)
total = total + f(x);
total = total * slice;
for(x=START+(切片/2);x
可能会产生误导,当你把它写成
for (x = START + (slice/2); x < END; x = x + slice) {
total = total + f(x);
}
total = total * slice;
for(x=START+(切片/2);x
相反
关于您的问题,正如Andrew所提到的,您可以通过使用整数变量在分区上循环来避免它,即
#pragma omp parallel for private(x) reduction(+:total)
for(int i = 0; i < partitions; i++) {
x = START + slice/2 + i*slice;
total = total + f(x);
}
total = total * slice;
#pragma omp并行专用(x)缩减(+:总计)
对于(int i=0;i
为什么使用slice作为循环计数器而不是分区?实际上我刚开始学习openMP,我发现这个问题对我来说是一个挑战,如果运行上面的串行代码,它将正确运行,以使用函数f(x)=sin(x/2)+1计算Pi/2和2pi之间的积分,因此问题是“#pragma omp parallel for”需要整数循环变量。。如果不是整数怎么办?由于(x=START+(slice/2);x,
可能会比预期多迭代+/-1次。vielen dank für ihre bemühungen非常感谢你。