基本信息
文件名称:2009并行程序设计期末考试卷-参考解答.docx
文件大小:47.8 KB
总页数:11 页
更新时间:2025-06-12
总字数:约1.08万字
文档摘要

中国科学技术大学

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