中国科学技术大学
2009-2010学年第一学期考试试卷
参考解答
考试科目:并行程序设计 得分:
学生所在系:
姓名: _
学号:
一、给出用基本的MPI_Send和MPI_Recv函数实现MPI_Allgather函数功能的伪代码。这三个函数的调用格式如下:(20分)
MPI_Send(buf,count,datatype,dest,tag,comm)
MPI_Recv(buf,count,datatype,source,tag,comm,status)
MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm)
参考解答:
for(i=0;iGroupSize;i++){
MPI_Send(sendbuf,sendcount,sendtype,i,myrank,MPI_COMM_WORLD);
}
for(i=0;iGroupSize;i++){MPI_Recv(recvbuf+i*recvcount,recvcount,
recvtype,i,i,MPI_COMM_WORLD,status);
}
二、以下是一个用C语言描述的计算的串行程序。(30分)
staticlongnum_steps=100000;doublestep;
voidmain()
{ inti;doublex,pi,sum=0.0;step=1.0/(double)num_steps;for(i=1;i=num_steps;i++){
x=(i-0.5)*step;
sum=sum+4.0/(1.0+x*x);
}
pi=step*sum;
}
请给出四种不同的OpenMP程序实现来并行计算。参考解答:
使用并行域并行化的程序
//OpenMPPIProgram:
//ParallelRegionexample(SPMDProgram)#includeomp.h
staticlongnum_steps=100000;doublestep;
#defineNUM_THREADS2voidmain()
{ inti;
doublex,pi,sum[NUM_THREADS];step=1.0/(double)num_steps;
omp_set_num_threads(NUM_THREADS)#pragmaompparallel
{ doublex;intid;
id=omp_get_thread_num();
for(i=id,sum[id]=0.0;inum_steps;i=i+NUM_THREADS){x=(i+0.5)*step;
sum[id]+=4.0/(1.0+x*x);
}
}
for(i=0,pi=0.0;iNUM_THREADS;i++)pi+=sum[i]*step;
}
使用共享任务结构并行化的程序
//OpenMPPIProgram:
//Worksharingconstruct#includeomp.h
staticlongnum_steps=100000;doublestep;
#defineNUM_THREADS2voidmain()
{ inti;
doublex,pi,sum[NUM_THREADS];step=1.0/(double)num_steps;
omp_set_num_threads(NUM_THREADS)#pragmaompparallel
{ doublex;intid;
2009-2010学年第一学期《并行程序设计》期末考试 第1页(共1页)
id=omp_get_thraead_num();sum[id]=0;
#pragmaompfor
for(i=0;inum_steps;i++){x=(i+0.5)*step;
sum[id]+=4.0/(1.0+x*x);
}
}
for(i=0,pi=0.0;iNUM_THREADS;i++)pi+=sum[i]*step;
}
使用private子句和critical部分并行化的程序
//OpenMPPIProgram:
//privateclauseandacriticalsection#includeomp.h
staticlong