6、练习和作业

为了实现基本的MPI通信功能,至少需要几个MPI调用?

MPI程序的第一条和最后一条可执行语句应为什么语句,如果不是这些语句,会导致什么样的后果?

MPI消息传递包括哪几个阶段?

MPI消息的组成是怎样的?

任意源和任意标识的作用是什么?

编写一个简单的实现发送和接收功能的程序。

给出MPI类型和FORTRAN类型的对应关系

MPI预定义数据类型 相应的FORTRAN77数据类型
MPI_INTEGER  
MPI_REAL
MPI_DOUBLE_PRECISION
MPI_COMPLEX
MPI_LOGICAL
MPI_CHARACTER
MPI_BYTE
MPI_PACKED

给出MPI类型和C类型的对应关系

MPI预定义数据类型 相应的C数据类型
MPI_CHAR  
MPI_SHORT
MPI_INT
MPI_LONG
MPI_UNSIGNED_CHAR
MPI_UNSIGNED_SHORT
MPI_UNSIGNED
MPI_UNSIGNED_LONG
MPI_FLOAT
MPI_DOUBLE
MPI_LONG_DOUBLE
MPI_BYTE
MPI_PACKED

 

下面三个例子那个类型匹配有问题?问什么?

例题 例1

REAL a(20),b(20)

CALL MPI_COMM_RANK(comm, rank, ierr)
IF(rank.EQ.0) THEN
CALL MPI_SEND(a(1), 10, MPI_REAL, 1, tag, comm, ierr)
ELSE IF (rank .EQ. 1) THEN
CALL MPI_RECV(b(1), 15, MPI_REAL, 0, tag, comm, status, ierr)
END IF


例题 例2

REAL a(20),b(20)

CALL MPI_COMM_RANK(comm, rank, ierr)
IF(rank.EQ.0) THEN
CALL MPI_SEND(a(1), 10, MPI_REAL, 1, tag, comm, ierr)
ELSE IF (rank .EQ. 1) THEN
CALL MPI_RECV(b(1), 40, MPI_BYTE, 0, tag, comm, status, ierr)
END IF


例题 例3

REAL a(20),b(20)

CALL MPI_COMM_RANK(comm, rank, ierr)
IF(rank.EQ.0) THEN
CALL MPI_SEND(a(1), 40, MPI_BYTE, 1, tag, comm, ierr)
ELSE IF (rank .EQ. 1) THEN
CALL MPI_RECV(b(1), 60, MPI_BYTE, 0, tag, comm, status, ierr)
END IF

指出下面两条调用的消息数据和消息信封部分
MPI_SEND( buf, count,datatype,dest,tag,comm)
MPI_RECV(buf,count,datatype,source,tag,comm,status)