東 華柬师花大学|数学科学学院 chool of Ma atical Sci East China Normal Universit 消息传递编程接口MPI (二)消息传递 http://math.ecnu.edu.cn/-jypan
http://math.ecnu.edu.cn/~jypan 消息传递编程接口 MPI (二)消息传递
华东师范大学数学科学学院 目录页 School of Mathematical Sciences,ECNU Contents 1 点对点通信 2 消息发送模式 3 聚合通信 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 目录页 Contents 华东师范大学 数学科学学院 School of Mathematical Sciences, ECNU http://math.ecnu.edu.cn/~jypan 1 2 点对点通信 消息发送模式 3 聚合通信
华东师范大学数学科学学院 目录页 School of Mathematical Sciences,ECNU Contents MPI点对点通信 ■ 阻塞型通信 1 点对点通信 非阻塞型通信 2 消息发送模式 ■ 检测函数 3 聚合通信 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 目录页 Contents 华东师范大学 数学科学学院 School of Mathematical Sciences, ECNU http://math.ecnu.edu.cn/~jypan 1 2 点对点通信 1 MPI 点对点通信 3 消息发送模式 聚合通信 阻塞型通信 非阻塞型通信 检测函数
阻塞型通信 MPI中的通信分为:阻塞型和非阻塞型 阻塞型(blocking) 阻塞型通信函数需要等待指定的操作实际完成,或所涉及的数据被MPI 系统安全备份后才返回。 ●阻塞型通信是非局部操作,它的完成可能涉及其它进程 ●MPI SEND和MPI RECV都是阻塞型的 http://math.ecnu.edu.cn/-jypan 4
http://math.ecnu.edu.cn/~jypan 4 阻塞型通信 MPI 中的通信分为:阻塞型和非阻塞型 阻塞型通信函数需要等待指定的操作实际完成,或所涉及的数据被 MPI 系统安全备份后才返回。 阻塞型通信是非局部操作,它的完成可能涉及其它进程 MPI_SEND 和 MPI_RECV 都是阻塞型的 阻塞型 (blocking)
阻塞型通信 非阻塞型(non blocking) 非阻塞型通信函数总是立即返回,实际操作由MPI后台进行,需要调用 其它函数来查询通信是否完成。 ●非阻塞型通信是局部操作 ●在实际操作完成之前对相关数据区域的操作是不安全的 ●在某些并行系统上,使用非阻塞型函数可以实现计算与通信的重叠 ●常用的非阻塞型通信函数为MPI ISEND和MPI IRECV http://math.ecnu.edu.cn/~jypan 5
http://math.ecnu.edu.cn/~jypan 5 阻塞型通信 非阻塞型通信函数总是立即返回,实际操作由 MPI 后台进行,需要调用 其它函数来查询通信是否完成。 非阻塞型通信是局部操作 在实际操作完成之前对相关数据区域的操作是不安全的 在某些并行系统上,使用非阻塞型函数可以实现计算与通信的重叠 常用的非阻塞型通信函数为 MPI_ISEND 和 MPI_IRECV 非阻塞型 (non blocking)
非阻塞型发送函数 MPI ISEND(buf,count,datatype,dest,tag,comm,request) int MPI Isend(void *buf,int count, MPI_Datatype datatype,int dest, int tag,MPI_Comm comm, MPI_Request *request) MPI_ISEND(BUF,COUNT,DATATYPE,DEST,TAG, COMM,REQUEST,IERR) F77 BUF(*) INTEGER COUNT,DATATYPE,DEST,TAG, COMM,REQUEST,IERR ●这里request是输出参数,为请求句柄,以备将来查询 ·其它参数含义与MPI SEND相同 ●在C中request的数据类型是MPI Request指针,FORTRAN中为整型 http://math.ecnu.edu.cn/-jypan 6
http://math.ecnu.edu.cn/~jypan 6 非阻塞型发送函数 MPI_ISEND(buf, count, datatype, dest, tag, comm, request) C int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request) F77 MPI_ISEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERR) BUF(*) INTEGER COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERR 这里 request 是输出参数,为请求句柄,以备将来查询 其它参数含义与 MPI_SEND 相同 在 C 中 request 的数据类型是 MPI_Request 指针,FORTRAN 中为整型
非阻塞型接收函数 MPI IRECV(buf,count,datatype,source,tag,comm,request) int MPI Irecv(void *buf,int count, MPI_Datatype datatype,int source, int tag,MPI_Comm comm, MPI_Request *request) MPI_IRECV(BUF,COUNT,DATATYPE,SOURCE, TAG,COMM,REQUEST,IERR) F77 BUF(*) INTEGER COUNT,DATATYPE,DEST,TAG, COMM,REQUEST,IERR ●参数中没有status,消息的查询使用request 阻塞型/非阻塞型通信函数使用时要保持一致性! http://math.ecnu.edu.cn/-jypan
http://math.ecnu.edu.cn/~jypan 7 非阻塞型接收函数 MPI_IRECV(buf, count, datatype, source, tag, comm, request) C int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request) F77 MPI_IRECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, REQUEST, IERR) BUF(*) INTEGER COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERR 参数中没有 status,消息的查询使用 request † 阻塞型/非阻塞型通信函数使用时要保持一致性!
非阻塞型通信检测 MPI WAIT(request,status) 参数 IN request 通信请求 OUT status 消息状态 C int MPI_Wait(MPI_Request *request, MPI_Status *status) MPI_WAIT(REQUEST,STATUS,IERR) F77 INTEGER REQUEST,IERR, STATUS(MPI_STATUS_SIZE) 该函数是阻塞型的,它必须等待指定的通信请求完成后才能返回,与之 相应的非阻塞型函数是MPI TEST。成功返回时,status中包含关于所 完成的通信的消息,相应的通信请求被释放,即request被置成 MPI REQUEST NULL http://math.ecnu.edu.cn/-jypan 8
http://math.ecnu.edu.cn/~jypan 8 非阻塞型通信检测 MPI_WAIT(request, status) 参数 IN request 通信请求 OUT status 消息状态 C int MPI_Wait(MPI_Request *request, MPI_Status *status) F77 MPI_WAIT(REQUEST, STATUS, IERR) INTEGER REQUEST, IERR, STATUS(MPI_STATUS_SIZE) 该函数是阻塞型的,它必须等待指定的通信请求完成后才能返回,与之 相应的非阻塞型函数是 MPI_TEST。成功返回时,status 中包含关于所 完成的通信的消息,相应的通信请求被释放,即 request 被置成 MPI_REQUEST_NULL
非阻塞型通信检测 MPI_TEST(request,flag,status) OUT 参数 f1ag操作是否完成标志 (其它参数含义同MPI WAIT) int MPI_Test(MPI_Request *request, int *flag,MPI_Status *status) MPI_TEST(REQUEST,FLAG,STATUS,IERR) F77 LOGICAL FLAG INTEGER REQUEST,IERR, STATUS(MPI_STATUS_SIZE) ·非阻塞型通信检测函数,不论通信是否完成都立刻返回,功能同 MPI WAIT http://math.ecnu.edu.cn/~jypan 9
http://math.ecnu.edu.cn/~jypan 9 非阻塞型通信检测 MPI_TEST(request, flag, status) 参数 OUT flag 操作是否完成标志 (其它参数含义同 MPI_WAIT) C int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status) F77 MPI_TEST(REQUEST, FLAG, STATUS, IERR) LOGICAL FLAG INTEGER REQUEST, IERR, STATUS(MPI_STATUS_SIZE) 非阻塞型通信检测函数,不论通信是否完成都立刻返回,功能同 MPI_WAIT
MPI WAITANY MPI WAITANY(count,array_of_requests,index,status) i IN count 请求句柄的个数 参数 INOUT array_.of_requests请求句柄数组 OUT index 已完成通信操作的句柄指标 OUT status 消息状态 int MPI_Waitany(int count, ! MPI_Request *array_of_requests, int *index,MPI_Status *status) MPI_WAITANY(COUNT,ARRAY_OF_REQUESTS, F77 INDEX,STATUS,IERR) INTEGER COUNT,ARRAY_OF_REQUESTS(*), INDEX,IERR,STATUS(MPI_STATUS_SIZE) ·所有请求句柄中至少有一个已经完成才返回,阻塞型函数 ·若有多个请求句柄已完成,则随机选择其中一个并立即返回 http://math.ecnu.edu.cn/-jypan 10
http://math.ecnu.edu.cn/~jypan 10 MPI_WAITANY MPI_WAITANY(count, array_of_requests, index, status) 参数 IN count 请求句柄的个数 INOUT array_of_requests 请求句柄数组 OUT index 已完成通信操作的句柄指标 OUT status 消息状态 C int MPI_Waitany(int count, MPI_Request *array_of_requests, int *index, MPI_Status *status) F77 MPI_WAITANY(COUNT, ARRAY_OF_REQUESTS, INDEX, STATUS, IERR) INTEGER COUNT, ARRAY_OF_REQUESTS(*), INDEX, IERR, STATUS(MPI_STATUS_SIZE) 所有请求句柄中至少有一个已经完成才返回,阻塞型函数 若有多个请求句柄已完成,则随机选择其中一个并立即返回