收藏 分享(赏)

第六讲消息传递编程接口 MPI.ppt

上传人:HR专家 文档编号:8058660 上传时间:2019-06-07 格式:PPT 页数:24 大小:161.50KB
下载 相关 举报
第六讲消息传递编程接口 MPI.ppt_第1页
第1页 / 共24页
第六讲消息传递编程接口 MPI.ppt_第2页
第2页 / 共24页
第六讲消息传递编程接口 MPI.ppt_第3页
第3页 / 共24页
第六讲消息传递编程接口 MPI.ppt_第4页
第4页 / 共24页
第六讲消息传递编程接口 MPI.ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、1,第六讲 消息传递编程接口 MPI,三、 MPI 数据类型,2,MPI 数据类型,MPI 数据类型定义MPI 数据类型的大小、上下界、域及相关函数MPI 新数据类型的创建、提交与释放MPI 数据的打包与解包,3,MPI 数据类型,MPI 原始数据类型,MPI 消息传递通常只能处理连续存放的同一类型的数据,MPI 的数据类型只用于消息传递!,4,MPI 数据类型定义,MPI 数据类型由两个相同长度的序列组成:类型序列和位移序列,t1, t2, t3, ., tn,d1, d2, d3, ., dn,ti 的取值为基本数据类型di 表示位移,取值为整数,以字节为单位新建的数据类型称为复合数据类型

2、,5,举例,例:设数据类型 mytype 的数据类型图为,(MPI_REAL,4),(MPI_REAL,12),(MPI_REAL,0),6,数据类型的大小,数据类型的大小,该数据类型中包含的数据长度,即字节数,(t1,d1),(t2,d2),(t3,d3), ., (tn,dn),sizeof(t1) + sizeof(t2) + . + sizeof(tn),设一个数据了下的类型图为,则它的大小为,例:设数据类型 mytype 的数据类型图为,(real,4),(real,12),(real,0),则 mytype 的大小为 12,7,数据类型的上下界,(t1,d1),(t2,d2),(t

3、3,d3), ., (tn,dn),数据类型的下界:类型图中的最小位移,即,数据类型的上界:,数据类型的域 (extent) :上界 下届,8,数据类型的对界量,原始数据类型的对界量:由编译系统决定,地址对界要求:一个数据类型在内存中所占的字节数必须是其对界量的整数倍,地址对界修正量:使得新建数据类型的域能被其对界量整除的最小非负整数,复合数据类型的对界量:其所包含的基本数据类型的对界量的最大值,9,举例,例:假设 MPI_DOUBLE_PRECISION 和 MPI_INTEGER 的对界量均为 4,MPI_BYTE 的对界量为 1,考虑下面的数据类型,(MPI_DOUBLE_PRECISI

4、ON,0), (MPI_BYTE,12), (MPI_INTEGER,8),对界量为 ,上界为 ,下界为 , 域为 ,地址对界修正量为 。,4,16,0,16,3,10,两个特殊的数据类型,MPI_LB、MPI_UB,伪数据类型,大小为 0,它们的作用:人工指定新建数据类型的上下界,若数据类型中含 MPI_LB,则下界定义为 MPI_LB 的位移的最小值;若数据类型中含 MPI_UB,则上界定义为 MPI_UB 的位移的最大值;,例:下面的数据类型的下界为 -4,(MPI_REAL,4), (MPI_LB,12), (MPI_REAL,0), (MPI_LB,-4),11,数据类型查询函数,M

5、PI_TYPE_EXTENT(datatype, extent),MPI_TYPE_SIZE(datatype, size),MPI_TYPE_UB(datatype, displacement),MPI_TYPE_LB(datatype, displacement),详细用法见相关参考资料,12,新数据类型的创建,新数据类型创建函数,MPI_TYPE_CONTIGUOUSMPI_TYPE_VECTOR、MPI_TYPE_HVECTORMPI_TYPE_INDEXED、MPI_TYPE_HINDEXED MPI_TYPE_STRUCT,新数据类型的提交:MPI_TYPE_COMMIT,若使用新

6、数据类型进行通信,则必须先提交过渡数据类型不用提交,用完后就可直接释放,新数据类型的释放:MPI_TYPE_FREE,数据的打包和解包:MPI_PACK、MPI_UNPACK,13,MPI_TYPE_CONTIGUOUS,MPI_TYPE_CONTIGUOUS(count, oldtype, newtype),连续复制:将原数据类型 oldtype 按顺序依次连续复制后,得到一个新的数据类型,注:oldtype 可以是原始数据类型,也可以是已创建的复合数据类型。,14,举例,integer n, type1 parameter (n=100) real a(n) . . . . call MP

7、I_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),15,MPI_TYPE_VECTOR,MPI_TYPE_VECTOR(count,blo

8、cklen,stride, oldtype, newtype),创建向量数据类型:先连续复制 blocklen 个 oldtype 类型的数据,形成一个数据块;再通过等间隔地复制 count 个该数据块而形成新的数据类型;相邻两个数据块的起始位置的位移相差为 stride*extent(oldtype) 个字节。,16,举例,integer n, type1 parameter (n=100) real A(n,n) . . . . call MPI_TYPE_VECTOR(n,1,n,MPI_REAL,type1,ierr) call MPI_TYPE_COMMIT(type1,ierr)

9、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 的对角线?,17,MPI_TYPE_HVECTOR,MPI_TYPE_HVECTOR(count,blocklen,stride, oldtype, newtype),功能同 MPI_TYPE_VECTOR唯一区

10、别为这里的 stride 以字节为单位,18,MPI_TYPE_INDEXED,MPI_TYPE_INDEXED(count,array_of_blocklens, array_of_disps,oldtype,newtype),创建索引数据类型:该函数生成的新数据类型由 count 个数据块构成,第 i 个数据块包含 array_of_bloklens(i) 个连续存放的 oldtype,第 i 个数据块与首地址的偏移量(字节数)为 array_of_disps(i)*extent(oldtype)。,可以看作是 MPI_TYPE_VECTOR 的扩展,区别是每个数据块的长度可以不同,数据块

11、之间的间隔也可以不同。,19,MPI_TYPE_HINDEXED,MPI_TYPE_HINDEXED(count,array_of_blocklens, array_of_disps,oldtype,newtype),功能同 MPI_TYPE_INDEXED唯一区别为这里的 array_of_disps 以字节为单位,20,MPI_TYPE_INDEXED,MPI_TYPE_STRUCT(count,array_of_blocklens, array_of_disps,array_of_types,newtype),创建结构数据类型:与 MPI_TYPE_HINDEXED 的区别在于每个数据块

12、的数据类型可以不同。这里的 array_of_disps 以字节为单位,该函数是最一般的新数据类型的构造函数,也是使用最广泛的一个,正确使用此函数在实际应用中非常重要,21,数据类型的提交与释放,新数据类型的提交,新数据类型的释放,MPI_TYPE_COMMIT(newdatatype),MPI_TYPE_FREE(newdatatype),22,地址函数,MPI_ADDRESS(location, address),返回指定变量在内存中的 “绝对” 地址,23,数据的打包,MPI_PACK(inbuf,incount,datatype,outbuf, outsize, position, c

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报