【发布时间】:2014-10-15 12:32:43
【问题描述】:
我正在尝试使用 openMP 使用多线程计算 4/(1+x^2) 在 c++ 中从 0 到 1 的积分。 我拿了一个串行程序(这是正确的)并对其进行了更改。 我的想法是: 假设 X 是线程数。 将函数下方的区域划分为 X 部分,首先从 0 到 1/X,从 1/X 到 2/X... 每个线程都会计算它的面积,我会总结一下。
我是这样实现的:
`//N.o. of threads to do the task
cout<<"Enter num of threads"<<endl;
int num_threads;
cin>>num_threads;
int i; double x,pi,sum=0.0;
step=1.0/(double)num_steps;
int steps_for_thread=num_steps/num_threads;
cout<<"Steps for thread : "<<steps_for_thread<<endl;
//Split to threads
omp_set_num_threads(num_threads);
#pragma omp parallel
{
int thread_id = omp_get_thread_num();
thread_id++;
if (thread_id == 1)
{
double sum1=0.0;
double x1;
for(i=0;i<num_steps/num_threads;i++)
{
x1=(i+0.5)*step;
sum1 = sum1+4.0/(1.0+x1*x1);
}
sum+=sum1;
}
else
{
double sum2=0.0;
double x2;
for(i=num_steps/thread_id;i<num_steps/(num_threads-thread_id+1);i++)
{
x2=(i+0.5)*step;
sum2 = sum2+4.0/(1.0+x2*x2);
}
sum+=sum2;
}
} '
说明: 第 i 个线程将计算 i/n 到 (i+1)/n 之间的面积并将其添加到总和中。
问题不仅在于输出错误,而且每次运行程序我得到不同的输出。
欢迎任何帮助 谢谢
【问题讨论】:
-
添加一些打印语句。
-
你得到了哪些输出?
-
取决于线程数。对于 2,我得到 3.6,3.8,2.9,而正确答案是 pi
标签: c++ multithreading openmp