谁能解释一下这个程序怎样实现并行的
#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;
}
这是一个计算积分的程序,他怎么实现并行的?最好每条语句都解释一下,大的好可以加分 展开
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;
}
这是一个计算积分的程序,他怎么实现并行的?最好每条语句都解释一下,大的好可以加分 展开
1个回答
展开全部
你得先学好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;
这部分在多线程并行部分之外,是由单线程执行的,作用是将前述各个线程独立间隔求和的结果汇总,得到完整的和,也就是数值积分结果。
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;
这部分在多线程并行部分之外,是由单线程执行的,作用是将前述各个线程独立间隔求和的结果汇总,得到完整的和,也就是数值积分结果。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询