基本信息
文件名称:2008并行程序设计期末考试卷.docx
文件大小:32.83 KB
总页数:2 页
更新时间:2025-06-12
总字数:约1.78千字
文档摘要

中国科学技术大学

2008-2009学年第一学期考试试卷

考试科目:并行程序设计 得分:

学生所在系:

姓名: _

学号:

一、给出以下循环中的迭代依赖图。(10分)

for(k=0;kN;k++){

a[k][k]=sqrt(a[k][k]);for(i=k+1;iN;i++){

a[i][k]=a[i][k]/a[k][k];for(j=k+1;jN;j++){

a[i][j]=a[i][j]-a[i][k]*a[k][j]/a[k][k];

}

}

}

二、分别考查以下循环中的依赖关系以及可向量化和可并行化情况(40分)

forI=2toN–1doforJ=2toN–1do

S: A(I,J)=B(I–1,J)+C

T: B(I,J)=A(I,J–1)*2

endforendfor

forI=1toNdo

forJ=1toNdo

: D(I,J) =A(I,J)+C

: A(I+1,J+1)=B(I,J)*2

endforendfor

三、给出以下程序的MPI并行实现。假设数组a的顺序分布于各计算进程(不必给出数据分发、空间分配以及结果收集的代码)。(20分)

for(j=0;j100000;j++)for(i=2;i10000;i++)

a[i]=sin(a[i]-a[i-1])+cos(a[i]+a[i-2]);

四、仔细阅读以下程序代码(30分)

给出OpenMP并行化实现(尽可能多地采用多线程并行化);

给出MPI并行化实现;假设:数组a采用行连续划分方式顺序分布于各计算进程,数组x的初值也被广播到各个进程(不必写数据分布与最后结果的回收代码了)。

注:在上述两种实现里,可以添加适当的变量及操作。

#defineN5000

#defineepsilon1e-5//10-5

doublex[N],newx[N],a[N][N],b[N],diff;inti,j;

main(){

……//a,b的初始化;

for(i=0;iN;i++)x[i]=b[i]/a[i][i];//设置数组x的初值

diff=epsilon;

while(diff=epsilon)do{diff=0;

for(i=0;iN;i++){

newx[i]=b[i];

for(j=0;jN;j++){

if(j!=i)newx[i]=newx[i]-a[i][j]*x[j];

}

newx[i]=newx[i]/a[i][i];

}

for(i=0;iN;i++){

diff=max(diff,fabs(newx[i]-x[i]));x[i]=newx[i];

}//设max为求最大值函数,而fabs为求绝对值函数。

}

……//输出x[i]

}

可能用到的MPI函数原型:

MPI_Send(buf,count,datatype,dest,tag,comm);

MPI_Recv(buf,count,datatype,source,tag,comm,MPI_Status*status);MPI_Bcast(buf,count,datatype,root,comm);

MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm);

MPI_Allreduce(sendbuf,recvbuf,count,datatype,MPI_Opop,comm);

2008-2009学年第一学期《并行程序设计》期末考试 第1页(共1页)