1.请简单描述OpenCL线程层次结构和AMD GPU存储器层次结构的对应关系。
答: AMD GPU存储器层次结构和OpenCL线程层次结构的对应关系:
LDS对应local memeory,主要用来在一个work group内的work times之间共享数据。steam core访问LDS的速度要比Globalmemory快一个数量级。
private memory对应每个pe的寄存器。
constant memory主要是利用了L1 cache。
OpenCL中的线程结构是可缩放的,Kernel的每个运行实例称作WorkItem(也就是线程),WorkItem组织在一起称作WorkGroup,OpenCL中,每个Workgroup之间都是相互独立的。
通过一个global id(在索引空间,它是唯一的)或者一个workgroup id和一个work group内的local id,我就能标定一个workitem。
2.天河1A参与TOP500排名的HPL Linpack实测速度是多少,效率是多少?
答:实测速度 2.57PetaFlops,效率是55%
3.请简述OpenMP的优、缺点有哪些?
答:OpenMP是针对单主机上多核/多CPU并行计算而设计的工具,换句话说,OpenMP更适合单台计算机共享内存结构上的并行计算。由于使用线程间共享内存的方式协调并行计算,它在多核/多CPU结构上的效率很高、内存开销小、编程语句简洁直观,因此编程容易、编译器实现也容易(现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持)。不过OpenMP最大的缺点是只能在单台主机上工作,不能用于多台主机间的并行计算。
4. 将下列代码改写为OpenMP程序,注意保持相同的计算结果。
int main()
{
int A[6], i;
for(i = 0; i< 6; i++) A[i] = i;
#pragma ompparallel
#pragma omp for
for(i=0;i<5;i++) A[i] = A[i+1];
printf("A=");
for(i=0; i <6; i++)
printf("%d ",A[i]);
printf("\n");
return 0;
}
答:
#include<omp.h>
int main()
{
int A[6], i;
#pragma ompparallel
{
#pragma omp for
for(i = 0; i< 6; i++) A[i] = i;
#pragma omp for
for(i=0;i<5;i++) A[i] = A[i+1];
printf("A=");
#pragma omp for
for(i=0; i <6; i++)
printf("%d ",A[i]);
printf("\n");
return 0;
}
}
5. MPI是一门语言吗?请给出简单的解释。
答:MPI是一个库,而不是一种语言。MPI(Message Passing Interface,消息传递接口)是并行计算经常用到的,用于进程间通信的一组API。MPI可以通过网络,在不同节点间进行通信。MPI也是MIC编程中较常使用的通信库之一。MPI标准定义了一组核心的库函数的语法及语义,它们对编写消息传递程序非常有用。MPI库中包含超过125个函数,但关键的函数要少得多。
6. MPI编程:Jacobi迭代。在一个二维平面上任意一点,每一次迭代的值是由其相邻数值点的平均得到的,即如下述串行程序所示:
…
REAL A(N+1,N+1), B(N+1,N+1)
…
DO K=1,STEP
DO J=1,N
DO I=1,N
B(I,J)=0.25*(A(I-1,J)+A(I+1,J)+A(I,J+1)+A(I,J-1))
END DO
END DO
DO J=1,N
DO I=1,N
A(I,J)=B(I,J)
END DO
END DO
END DO
试用MPI写出Jacobi迭代的并行程序
答:Integer ierr, myid,numproces
REALA(N+1,N+1),B(N+1,N+1)
...
DO K=1,STEP
Call MPI_INIT(ierr)
CallMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)
CallMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)
DO J=myid+1,N,numprocs
答: AMD GPU存储器层次结构和OpenCL线程层次结构的对应关系:
LDS对应local memeory,主要用来在一个work group内的work times之间共享数据。steam core访问LDS的速度要比Globalmemory快一个数量级。
private memory对应每个pe的寄存器。
constant memory主要是利用了L1 cache。
OpenCL中的线程结构是可缩放的,Kernel的每个运行实例称作WorkItem(也就是线程),WorkItem组织在一起称作WorkGroup,OpenCL中,每个Workgroup之间都是相互独立的。
通过一个global id(在索引空间,它是唯一的)或者一个workgroup id和一个work group内的local id,我就能标定一个workitem。
2.天河1A参与TOP500排名的HPL Linpack实测速度是多少,效率是多少?
答:实测速度 2.57PetaFlops,效率是55%
3.请简述OpenMP的优、缺点有哪些?
答:OpenMP是针对单主机上多核/多CPU并行计算而设计的工具,换句话说,OpenMP更适合单台计算机共享内存结构上的并行计算。由于使用线程间共享内存的方式协调并行计算,它在多核/多CPU结构上的效率很高、内存开销小、编程语句简洁直观,因此编程容易、编译器实现也容易(现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持)。不过OpenMP最大的缺点是只能在单台主机上工作,不能用于多台主机间的并行计算。
4. 将下列代码改写为OpenMP程序,注意保持相同的计算结果。
int main()
{
int A[6], i;
for(i = 0; i< 6; i++) A[i] = i;
#pragma ompparallel
#pragma omp for
for(i=0;i<5;i++) A[i] = A[i+1];
printf("A=");
for(i=0; i <6; i++)
printf("%d ",A[i]);
printf("\n");
return 0;
}
答:
#include<omp.h>
int main()
{
int A[6], i;
#pragma ompparallel
{
#pragma omp for
for(i = 0; i< 6; i++) A[i] = i;
#pragma omp for
for(i=0;i<5;i++) A[i] = A[i+1];
printf("A=");
#pragma omp for
for(i=0; i <6; i++)
printf("%d ",A[i]);
printf("\n");
return 0;
}
}
5. MPI是一门语言吗?请给出简单的解释。
答:MPI是一个库,而不是一种语言。MPI(Message Passing Interface,消息传递接口)是并行计算经常用到的,用于进程间通信的一组API。MPI可以通过网络,在不同节点间进行通信。MPI也是MIC编程中较常使用的通信库之一。MPI标准定义了一组核心的库函数的语法及语义,它们对编写消息传递程序非常有用。MPI库中包含超过125个函数,但关键的函数要少得多。
6. MPI编程:Jacobi迭代。在一个二维平面上任意一点,每一次迭代的值是由其相邻数值点的平均得到的,即如下述串行程序所示:
…
REAL A(N+1,N+1), B(N+1,N+1)
…
DO K=1,STEP
DO J=1,N
DO I=1,N
B(I,J)=0.25*(A(I-1,J)+A(I+1,J)+A(I,J+1)+A(I,J-1))
END DO
END DO
DO J=1,N
DO I=1,N
A(I,J)=B(I,J)
END DO
END DO
END DO
试用MPI写出Jacobi迭代的并行程序
答:Integer ierr, myid,numproces
REALA(N+1,N+1),B(N+1,N+1)
...
DO K=1,STEP
Call MPI_INIT(ierr)
CallMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)
CallMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)
DO J=myid+1,N,numprocs