谁能解释一下这个程序怎样实现并行的

#include<omp.h>staticlongnum_steps=100000;doublestep;#defineNUM_THREADS2voidmain(){in... #include <omp.h>
static long num_steps = 100000;
double step;
#define NUM_THREADS 2
void main ()
{ int i;
double x, pi, sum[NUM_THREADS];
step = 1.0/(double) num_steps;
omp_set_num_threads(NUM_THREADS); //
#pragma omp parallel
{
double x;
int id;
id = omp_get_thread_num();
for (i=id, sum[id]=0.0;i< num_steps; i=i+NUM_THREADS){//

x = (i+0.5)*step;
sum[id] += 4.0/(1.0+x*x);
}
}
for(i=0, pi=0.0;i<NUM_THREADS;i++)
pi += sum[i] * step;
}
这是一个计算积分的程序,他怎么实现并行的?最好每条语句都解释一下,大的好可以加分
展开
 我来答
marine_marion
2009-09-07 · TA获得超过6823个赞
知道大有可为答主
回答量:1505
采纳率:0%
帮助的人:2740万
展开全部
你得先学好OpenMP并行程序扩展才能看懂

omp_set_num_threads(NUM_THREADS);
这一句是调用OpenMP库函数,指定下面启动 NUM_THREADS 个线程,
最多可以将每个线程安排到一个单独的CPU核心上实现多CPU/多核心并行。

#pragma omp parallel
编译器制导语句,要求其下内容分配到各个线程中单独执行,也就是将
{
double x;
int id;
id = omp_get_thread_num();
for (i=id, sum[id]=0.0;i< num_steps; i=i+NUM_THREADS){//

x = (i+0.5)*step;
sum[id] += 4.0/(1.0+x*x);
}
}
这一部分在每个线程中独立执行。

id = omp_get_thread_num();
这一句是本线程获取线程序号(OpenMP自动分配的)

for (i=id, sum[id]=0.0;i< num_steps; i=i+NUM_THREADS)
{
x = (i+0.5)*step;
sum[id] += 4.0/(1.0+x*x);
}
依据刚获得的本线程序号,以步进长度NUM_THREADS(线程总数)间隔地累加求和,好比线程0求和第0、2、4、6、8……块,线程1求和第1、3、5、7、9……块。

for(i=0, pi=0.0;i<NUM_THREADS;i++)
pi += sum[i] * step;
这部分在多线程并行部分之外,是由单线程执行的,作用是将前述各个线程独立间隔求和的结果汇总,得到完整的和,也就是数值积分结果。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式