如何解决为什么这段使用openmp计算Pi值的代码每次给出的答案最后几个浮点数都略有不同?
这是我使用openmp的解决方案,该解决方案用于并行化计算Pi的代码。 Pi的浮点值每次执行时都会改变。有人可以解释为什么吗?
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#define THREAD_NUM 20
static long num_steps = 100000;
double step;
int main(){
int i;
double x;
double pi;
double sum = 0.0;
double t1 = 0.0;
double t2 = 0.0;
step = 1.0/(double) num_steps;
omp_set_num_threads(THREAD_NUM);
t1 = omp_get_wtime();
#pragma omp parallel
{
double p_sum = 0.0;
#pragma omp for
for(i=0; i<num_steps; i++){
x = (i+0.5)*step;
p_sum = p_sum + 4.0/(1.0+x*x);
}
#pragma omp atomic
sum += p_sum;
}
t2 = omp_get_wtime();
pi = step*sum;
printf("value of pi = %lf\n",pi);
printf("time = %lf ms\n",(t2-t1)*1000);
}
解决方法
浮点加法既不是关联的也不是可交换的!这意味着您获得的确切值取决于p_sum
/ sum
的组成部分相加的顺序。要精确地理解为什么您必须了解浮点加法在实践中是如何工作的。我建议阅读What Every Computer Scientist should Know About Floating-Point Arithmetic。
正如@Gilles在问题下的注释中指出的那样,问题在于x变量被声明为共享变量。应该将其声明为私有变量。
...
#pragma omp parallel
{
double x;
double p_sum = 0.0;
#pragma omp for
for(i=0; i<num_steps; i++){
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。