好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

六章节消息传递编程接口MPI.ppt

24页
  • 卖家[上传人]:cl****1
  • 文档编号:586426761
  • 上传时间:2024-09-04
  • 文档格式:PPT
  • 文档大小:161.52KB
  • / 24 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第六讲消息传递编程接口 MPI三、三、 MPI 数据类型数据类型1 MPI 数据类型数据类型n MPI 数据类型定义数据类型定义n MPI 数据类型的大小、上下界、域及相关函数数据类型的大小、上下界、域及相关函数n MPI 新数据类型的创建、提交与释放新数据类型的创建、提交与释放n MPI 数据的打包与解包数据的打包与解包2 MPI 数据类型数据类型n MPI 原始数据类型原始数据类型l MPI 消息传递通常只能处理消息传递通常只能处理连续存放连续存放的的同一类型同一类型的数据的数据n MPI 自定义数据类型自定义数据类型l 如果需要发送或接收具有复杂结构的数据时,可以使用自定如果需要发送或接收具有复杂结构的数据时,可以使用自定义数据类型义数据类型l 使用自定义数据类型的好处:使用自定义数据类型的好处: 有效减少消息传递次数,增大通信粒度,同时可以避免或有效减少消息传递次数,增大通信粒度,同时可以避免或减少消息传递时数据在内存中的拷贝减少消息传递时数据在内存中的拷贝MPI MPI 的数据类型只用于消息传递的数据类型只用于消息传递!!3 MPI 数据类型定义数据类型定义n MPI 数据类型由两个相同长度的序列组成:数据类型由两个相同长度的序列组成:类型序列类型序列和和位位移序列移序列{t1, t2, t3, ..., tn}{d1, d2, d3, ..., dn}l ti 的取值为的取值为基本数据类型基本数据类型l di 表示位移,取值表示位移,取值为整数,以为整数,以字节字节为单位为单位l 新建的数据类型称为新建的数据类型称为复合数据类型复合数据类型n MPI 数据类型图数据类型图{(t1,d1),(t2,d2),(t3,d3), ..., (tn,dn)}这个新的数据类型包含这个新的数据类型包含 n 个数据,其中第个数据,其中第 i 个数据的数据类个数据的数据类型为型为 ti,该数据离首地址的距离为,该数据离首地址的距离为 di4 举例举例例:例:设数据类型设数据类型 mytype 的数据类型图为的数据类型图为{(MPI_REAL,4),(MPI_REAL,12),(MPI_REAL,0)}则下面的语句:则下面的语句:real A(100)... ...call MPI_SEND(A, 1, mytype, ... )发送的数据为发送的数据为A(2), A(4), A(1)5 数据类型的大小数据类型的大小n 数据类型的大小数据类型的大小l 该数据类型中包含的数据长度,即该数据类型中包含的数据长度,即字节数字节数{(t1,d1),(t2,d2),(t3,d3), ..., (tn,dn)}sizeof(t1) + sizeof(t2) + ... + sizeof(tn)设一个数据了下的类型图为设一个数据了下的类型图为则它的大小为则它的大小为 例:例:设数据类型设数据类型 mytype 的数据类型图为的数据类型图为{(real,4),(real,12),(real,0)}则则 mytype 的大小为的大小为 126 数据类型的上下界数据类型的上下界{(t1,d1),(t2,d2),(t3,d3), ..., (tn,dn)}l 数据类型的下界:数据类型的下界:类型图中的最小位移,即类型图中的最小位移,即l 数据类型的上界:数据类型的上界:l 数据类型的域数据类型的域 (extent) :上界:上界 -- 下届下届7 数据类型的对界量数据类型的对界量l 原始数据类型的原始数据类型的对界量:对界量:由编译系统决定由编译系统决定l 地址对界要求:地址对界要求:一个数据类型在内存中所占的字节数必一个数据类型在内存中所占的字节数必须是其对界量的整数倍须是其对界量的整数倍l 地址对界修正量:地址对界修正量:使得新建数据类型的使得新建数据类型的域域能被其对界量能被其对界量整除的整除的最小非负整数最小非负整数l 复合数据类型的对界量:复合数据类型的对界量:其所包含的基本数据类型的其所包含的基本数据类型的对界量的对界量的最大值最大值8 举例举例例:例:假设假设 MPI_DOUBLE_PRECISION 和和 MPI_INTEGER 的对界量均为的对界量均为 4,,MPI_BYTE 的对界量为的对界量为 1,考虑下面的数,考虑下面的数据类型据类型{(MPI_DOUBLE_PRECISION,0), (MPI_BYTE,12), (MPI_INTEGER,8)}对界量为对界量为 ,上界为,上界为 ,下界为,下界为 ,,域为域为 ,地址对界修正量为,地址对界修正量为 。

      41601639 两个特殊的数据类型两个特殊的数据类型 MPI_LB、、MPI_UBl 伪数据类型,大小为伪数据类型,大小为 0l 它们的作用:人工指定新建数据类型的上下界它们的作用:人工指定新建数据类型的上下界l 若数据类型中含若数据类型中含 MPI_LB,则下界定义为,则下界定义为 MPI_LB 的位移的位移的最小值;的最小值;l 若数据类型中含若数据类型中含 MPI_UB,则上界定义为,则上界定义为 MPI_UB 的位移的位移的最大值;的最大值; 例:例:下面的数据类型的下界为下面的数据类型的下界为 -4{(MPI_REAL,4), (MPI_LB,12), (MPI_REAL,0), (MPI_LB,-4)}10 数据类型查询函数数据类型查询函数MPI_TYPE_EXTENT(datatype, extent)MPI_TYPE_SIZE(datatype, size)MPI_TYPE_UB(datatype, displacement)MPI_TYPE_LB(datatype, displacement)l 详细用法见相关参考资料详细用法见相关参考资料11 新数据类型的创建新数据类型的创建n 新数据类型创建函数新数据类型创建函数l MPI_TYPE_CONTIGUOUSl MPI_TYPE_VECTOR、、MPI_TYPE_HVECTORl MPI_TYPE_INDEXED、、MPI_TYPE_HINDEXED l MPI_TYPE_STRUCT n 新数据类型的提交:新数据类型的提交:MPI_TYPE_COMMITl 若使用新数据类型进行若使用新数据类型进行通信通信,则必须先提交,则必须先提交l 过渡数据类型不用提交,用完后就可直接释放过渡数据类型不用提交,用完后就可直接释放 n 新数据类型的释放:新数据类型的释放:MPI_TYPE_FREE n 数据的打包和解包:数据的打包和解包:MPI_PACK、、MPI_UNPACK 12 MPI_TYPE_CONTIGUOUSMPI_TYPE_CONTIGUOUS(count, oldtype, newtype)参数参数IN count 复制个数复制个数IN oldtype 旧数据类型旧数据类型OUT newtype 新数据类型新数据类型 Cint MPI_Type_contiguous(int count, MPI_Datatype oldtype, MPI_Datatype *newtype)F77MPI_TYPE_CONTIGUOUS(COUNT, OLDTYPE, NEWTYPE, IERR)INTEGER COUNT, OLDTYPE, NEWTYPE, IERRl 连续复制:连续复制:将原数据类型将原数据类型 oldtype 按顺序依次连续复制后,按顺序依次连续复制后,得到一个新的数据类型得到一个新的数据类型l 注:注:oldtype 可以是原始数据类型,也可以是已创建的复合数据类型。

      可以是原始数据类型,也可以是已创建的复合数据类型13 举例举例integer n, type1parameter (n=100)real a(n)... ...... ...call MPI_TYPE_CONTIGUOUS(n,MPI_REAL,type1,ierr)call MPI_TYPE_COMMIT(type1,ierr)call MPI_SENDRECV_REPLACE(a,1,type1,dst,111,src, 111,MPI_COMM_WORLD,status,ierr)... ...上面的消息传递等价于上面的消息传递等价于 call MPI_SENDRECV_REPLACE(a,100,MPI_REAL,dst,111, src,111,MPI_COMM_WORLD,status,ierr)14 MPI_TYPE_VECTORMPI_TYPE_VECTOR(count,blocklen,stride, oldtype, newtype)Cint MPI_Type_vector(int count,int blocklen, int stride, MPI_Datatype oldtype, MPI_Datatype *newtype)F77MPI_TYPE_VECTOR(COUNT, BLOCKLEN, STRIDE, OLDTYPE, NEWTYPE, IERR)INTEGER COUNT,BLOCKLEN,STRIDE, OLDTYPE, NEWTYPE, IERRl 创建向量数据类型:创建向量数据类型:先连续复制先连续复制 blocklen 个个 oldtype 类型类型的数据,形成一个数据块;再通过的数据,形成一个数据块;再通过等间隔等间隔地复制地复制 count 个该个该数据块而形成新的数据类型;相邻两个数据块的数据块而形成新的数据类型;相邻两个数据块的起始位置起始位置的位的位移相差为移相差为 stride*extent(oldtype) 个字节。

      个字节15 举例举例integer n, type1parameter (n=100)real A(n,n)... ...... ...call MPI_TYPE_VECTOR(n,1,n,MPI_REAL,type1,ierr)call MPI_TYPE_COMMIT(type1,ierr)call MPI_SEND(A,1,type1,dst,...)... ...上面发送的是上面发送的是 A 的第一行大家看看下面发送的是什么?的第一行大家看看下面发送的是什么? call MPI_TYPE_VECTOR(n-2,n-2,n,MPI_REAL,type1,ierr)call MPI_TYPE_COMMIT(type1,ierr)call MPI_SEND(A(2,2),1,type1,dst,...)思考:怎样发送思考:怎样发送 A 的对角线?的对角线?16 MPI_TYPE_HVECTORMPI_TYPE_HVECTOR(count,blocklen,stride, oldtype, newtype)l 功能同功能同 MPI_TYPE_VECTORl 唯一区别为这里的唯一区别为这里的 stride 以字节为单位以字节为单位 17 MPI_TYPE_INDEXEDMPI_TYPE_INDEXED(count,array_of_blocklens, array_of_disps,oldtype,newtype)l 创建索引数据类型:创建索引数据类型:该函数生成的新数据类型由该函数生成的新数据类型由 count 个数个数据块构成,第据块构成,第 i 个数据块包含个数据块包含 array_of_bloklens(i) 个连续个连续存放的存放的 oldtype,第,第 i 个数据块与首地址的偏移量个数据块与首地址的偏移量(字节数字节数)为为 array_of_disps(i)*extent(oldtype)。

      l 可以看作是可以看作是 MPI_TYPE_VECTOR 的扩展,区别是每个数据块的的扩展,区别是每个数据块的长度可以不同长度可以不同,数据块之间的,数据块之间的间隔也可以不同间隔也可以不同18 MPI_TYPE_HINDEXEDMPI_TYPE_HINDEXED(count,array_of_blocklens, array_of_disps,oldtype,newtype)l 功能同功能同 MPI_TYPE_INDEXEDl 唯一区别为这里的唯一区别为这里的 array_of_disps 以字节为单位以字节为单位 19 MPI_TYPE_INDEXEDMPI_TYPE_STRUCT(count,array_of_blocklens, array_of_disps,array_of_types,newtype)l 创建结构数据类型:创建结构数据类型:与与 MPI_TYPE_HINDEXED 的区别在于每的区别在于每个数据块的个数据块的数据类型可以不同数据类型可以不同这里的 array_of_disps 以字以字节为单位节为单位 l 该函数是最一般的新数据类型的构造函数,也是使用最广泛该函数是最一般的新数据类型的构造函数,也是使用最广泛的一个,正确使用此函数在实际应用中非常重要的一个,正确使用此函数在实际应用中非常重要20 数据类型的提交与释放数据类型的提交与释放n 新数据类型的提交新数据类型的提交 n 新数据类型的释放新数据类型的释放 MPI_TYPE_COMMIT(newdatatype) MPI_TYPE_FREE(newdatatype)21 地址函数地址函数MPI_ADDRESS(location, address)l 返回指定变量在内存中的返回指定变量在内存中的 “绝对绝对” 地址地址Cint MPI_Address(void *location, MPI_Aint *address)F77MPI_ADDRESS(LOCATION, ADDRESS, IERR) LOCATION(*)INTEGER ADDRESS, IERR22 数据的打包数据的打包MPI_PACK(inbuf,incount,datatype,outbuf, outsize, position, comm)l 将缓冲区将缓冲区 inbuf 中的中的 incount 个类型为个类型为 datatype 的数据进的数据进行打包,打包后的数据放在缓冲区行打包,打包后的数据放在缓冲区 outbuf 中。

      中outsize 给出给出的是的是 outbuf 的总长度(字节数),的总长度(字节数),comm 是发送打包数据时将是发送打包数据时将使用的通信器使用的通信器l position 是打包缓冲区中的位移,每次打包第一次调用是打包缓冲区中的位移,每次打包第一次调用 MPI_PACK 时用户应该将其置为时用户应该将其置为 0,随后,随后 MPI_PACK 将自动修改将自动修改它,使得它总是指向打包缓冲区中尚未使用部分的起始位置它,使得它总是指向打包缓冲区中尚未使用部分的起始位置每次调用每次调用 MPI_PACK 后的后的 position 实际上就是已打包数据的实际上就是已打包数据的总长度通过连续几次对不同位置的数据进行打包,就可以将总长度通过连续几次对不同位置的数据进行打包,就可以将不连续的数据放到一个连续的空间中不连续的数据放到一个连续的空间中23 数据的解包数据的解包MPI_UNPACK(inbuf,insize,position,outbuf, outcount,datatype,comm)l 是是 MPI_PACK 的逆操作:它从的逆操作:它从 inbuf 中拆包中拆包 outcount 个个类型为类型为 datatype 的数据到的数据到 outbuf 中。

      中l 函数的各项参数与函数的各项参数与 MPI_PACK 类似,只不过这里的类似,只不过这里的 inbuf 和和 insize 对应于对应于 MPI_PACK 中的中的 outbuf 和和 outsize,而,而 outbuf 和和 outcount 则对应于则对应于 MPI_PACK 中的中的 inbuf 和和 incount24 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.