您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > C04-MPI的扩展MPI-2
MPI的扩展MPI-2谭光明副研究员tgm@ncic.ac.cn中国科学院计算技术研究所国家智能计算机研究开发中心计算机体系结构国家重点实验室(筹)MPI-1的不足•不支持进程个数的动态改变•不支持单边通信模式•不支持并行文件操作应用需求•动态任务树•精确成型应用实例MPI-2的解决方案•对通信域进行扩展–组内通信域–组间通信域•具体实现方式–动态派生进程(有父子关系)–独立进程间通信(C/S关系)–Socket通信(转换socket通信)组间通信域的点到点通信例子•MPI_SEND(buf,count,datatype,dest,tag,intercomm)•与组内通信的不同:1dest的含义;2intercomm•MPI_RECV(buf,count,datatype,source,tag,intercomm,status)•与组内通信的不同:1source的含义;2intercomm组间通信域的组通信例子•MPI_ALLTOALL(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,intercomm)图示组间通信域的一对多和多对一•本地一个发,对方所有的收•本地一个收,对方所有的发例子•MPI_BCAST(buf,count,datatype,root,intercomm)主进程组中动态进程的创建•MPI_COMM_SPAWN(cmd,argv,maxprocs,info,root,comm,intercomm,aryerrcodes)最多派生maxprocs个进程,root是参数检查的进程派生进程组得到组间通信域•MPI_COMM_GET_PARENT(parent)•在派生进程组中调用•在初始化之后•三次同步–父进程同步–子进程之间同步–父子进程之间同步源程序主进程组程序(独立的MPI程序)派生进程组程序(独立的MPI程序)启动创建多组子进程•MPI_COMM_SPAWN_MULTIPLE(count,cmdary,argvary,maxprocsary,infoary,root,comm,intercomm,errcodeary)•各组子进程是不同的独立进程间通信•服务端•MPI_OPEN_PORT(info,port_name)•MPI_COMM_ACCEPT(port_name,info,root,comm,intercomm)•在打开的特定端口上等待连接独立进程间通信(续)•客户端•MPI_COMM_CONNECT(port_name,info,root,comm,intercomm)•请求与指定端口连接•MPI_COMM_DISCONNECT(comm)问题•客户端每次连接的端口可能是不同的方案•服务端–建立特定名字和端口字符串的联系–MPI_PUBLISH_NAME(servicename,info,portname)•客户端–根据名字得到特定的端口字符串–MPI_LOOKUP_NAME(servicename,info,portname)基于socket的通信•MPI_COMM_JOIN(fd,intercomm)•将socket通信转化为MPI通信什么是远程存储访问(单边通信)?RemoteMemoryAccess/One-SidedCommunication•打电话•留字条•阅读EMAIL通信窗口•开辟自己内存的一段空间作为对外联系的窗口,任何进程都可以通过对窗口的访问来达到数据通信的目的内存区域窗口内存区域窗口窗口操作的分类•窗口读MPI_GET•窗口写MPI_PUT•窗口运算MPI_ACCUMULATE窗口的创建•MPI_WIN_CREATE(base,size,disp_unit,info,comm,win)注意•窗口创建操作是组调用,所有的进程必须都执行•得到的窗口是组窗口,与给定的通信域密切相关•用同一窗口对象可以访问所有其它进程的窗口窗口的释放•MPI_WIN_FREE(win)•当所有窗口都不再使用时释放•是组调用远程更新(向窗口写)•MPI_PUT(origin_addr,origin_count,origin_datatype,target_rank,target_disp,target_count,target_datatype,win)注意•不同进程的窗口是通过进程标识来区别的•对不同进程窗口的操作使用的是同一窗口句柄•偏移是以创建窗口时指定的偏移单位大小计算的从远程得到数据(从窗口读)•MPI_GET(origin_addr,origin_count,origin_datatype,target_rank,target_disp,target_count,target_datatype,win)注意•写窗口的逆操作•不同进程的窗口是通过进程标识来区别的•对不同进程窗口的操作使用的是同一窗口句柄•偏移是以创建窗口时指定的偏移单位大小来计算的对远程数据的计算(窗口数据运算)MPI_ACCUMULATE(origin_addr,origin_count,origin_datatype,target_rank,target_disp,target_count,target_datatype,op,win)图示•同时执行了窗口的读和写操作问题•访问冲突问题(R,W)–读读(RR)–读写(RW)–写读(WR)–写写(WW)•解决办法–窗口同步管理窗口同步管理•栅栏方式•握手方式•锁方式栅栏方式•MPI_WIN_FENCE(assert,win)•assert=0窗口操作前窗口操作完成窗口操作示例前后两次窗口操作互不干扰握手方式•第一次握手,为窗口访问作准备•第二次握手,窗口访问完成发起访问方的操作顺序•MPI_WIN_START(group,assert,win)启动第一次握手(开始窗口访问)•窗口操作•MPI_WIN_COMPLETE(win)启动第二次握手(结束窗口访问)接收访问方的操作过程•MPI_WIN_POST(group,assert,win)启动第一次握手(准备窗口操作)•等待被访问•MPI_WIN_WAIT(win)启动第二次握手(窗口操作结束)图示锁方式•借鉴临界区的概念•加锁后只允许自己访问•开锁后将访问权让给别人加锁语句•MPI_WIN_LOCK(lock_type,rank,assert,win)•共享锁:允许其它的进程同时加共享锁•互斥锁:不允许其它的进程再加锁开锁语句•MPI_WIN_UNLOCK(rank,win)•允许其它的进程加锁图示练习•请用单边通信重新实现Jacobi迭代的例子。•请写一个简单的动态进行创建的例子并行文件I/O的分类•显式偏移的文件I/O•视口文件I/O•共享文件I/O一些基本操作并行文件打开•MPI_FILE_OPEN(comm,filename,amode,info,fh)•文件打开•组调用,amode必须都相同•fh是一个组句柄(与WIN类似)•与用C/Fortran打开文件不同文件打开方式文件关闭•MPI_FILE_CLOSE(fh)•注意:组调用删除指定的文件•MPI_FILE_DELETE(filename,info)文件大小•MPI_FILE_SET_SIZE(fh,size)•组调用,所有的size都相同•MPI_FILE_GET_SIZE(fh,size)文件进程组与文件打开模式•MPI_FILE_GET_GROUP(fh,group)•返回句柄fh对应的进程组group•MPI_FILE_GET_AMODE(fh,amode)•返回打开文件时指定的模式具有显式偏移的文件操作阻塞显式偏移并行文件读写•MPI_FILE_READ_AT(fh,offset,buf,count,datatype,status)写文件•MPI_FILE_WRITE_AT(fh,offset,buf,count,datatype,status)组调用阻塞显式偏移并行文件读写•MPI_FILE_READ_AT_ALL(fh,offset,buf,count,datatype,status)•组调用,所有进程都执行了一次MPI_FILE_READ_AT•MPI_FILE_WRITE_AT_ALL(fh,offset,buf,count,datatype,status)•组调用,所有进程都执行了一次MPI_FILE_WRITE_AT非阻塞显式偏移并行文件读写•MPI_FILE_IREAD_AT(fh,offset,buf,count,datatype,request)•MPI_FILE_IWRITE_AT(fh,offset,buf,count,datatype,request)•同非阻塞通信的基本含义,调用返回并不意味着操作的完成完成形式•MPI_WAIT•MPI_TEST•与非阻塞通信的完成调用形式完全相同非阻塞组调用显式偏移并行文件读写•具有显式的开始与结束形式•MPI_FILE_READ_AT_ALL_BEGIN(fh,offset,buf,count,datatype)•组调用读开始•MPI_FILE_READ_AT_ALL_END(fh,buf,status)•组调用读结束写操作•MPI_FILE_WRITE_AT_ALL_BEGIN(fh,offset,buf,count,datatype)•组调用写开始•MPI_FILE_WRITE_AT_ALL_END(fh,buf,status)•组调用写结束视口文件读写•特点:隐式文件指针•取文件的一部分形成视口,然后对该视口进行操作,每个进程把视口看作是整个文件文件视口•起始偏移,基本类型,文件类型•文件类型是在基本类型的基础上形成的自定义数据类型文件视口的定义•MPI_FILE_SET_VIEW(fh,disp,etype,filetype,datarep,info)数据表示•native(效率最高,移植性最差)•internal(效率一般,移植性一般)•external32(效率最低,移植性最好)文件视口的定义(续)•组调用•偏移的单位是字节•视口数据是连续的•文件句柄的含义转换视口信息的获取•MPI_FILE_GET_VIEW(fh,disp,etype,filetype,datarep)•得到偏移,基本类型,文件类型以及数据表示等信息当前视口指针偏移•MPI_FILE_GET_POSITION(fh,offset)•文件视口句柄,视口偏移绝对偏移•MPI_FILE_GET_BYTE_OFFSET(fh,offset,disp)•给定相对偏移offset,给出绝对偏移disp阻塞方式的视口读写•MPI_FILE_READ(fh,buf,count,datatype,status)•从视口当前位置读数据•MPI_FILE_WRITE(fh,buf,count,datatype,status)•向视口当前位置写数据阻塞方式的视口文件组调用•MPI_FILE_READ_ALL(fh,buf,count,datatype,status)•组内所有进程都读•MPI_FILE_WRITE_ALL(fh,buf,count,datatype,status)•组内所有进程都写非阻塞视口文件读写•MPI_FILE_IREAD(fh,buf,count,datatype,request)•非阻塞视口文件读•MPI_FILE_IWRITE(fh,buf,count,datatype,request)•非阻塞视口文件写完成操作•MPI_WAIT•MPI_TEST•同非阻塞的通信调用形式非阻塞视口组调用•MPI_FILE_READ_ALL_BEGIN(fh,buf,count,datatype)•组内进程都执行非阻塞的读操作•MPI_FILE_READ_ALL_END(fh,buf,status)•组调用读操作完成组调用写操作•MPI_FILE_WRITE_ALL_BEGIN(fh,buf,count,datatype)•组调用写操
本文标题:C04-MPI的扩展MPI-2
链接地址:https://www.777doc.com/doc-7027835 .html