Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OpenMP:如果循环变量不是整数(如本例所示),会发生什么情况?_C_Openmp - Fatal编程技术网

C OpenMP:如果循环变量不是整数(如本例所示),会发生什么情况?

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

#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, 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非常感谢你。