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

上传人:本田雅阁 文档编号:3186285 上传时间:2019-07-22 格式:PPT 页数:24 大小:161.54KB
返回 下载 相关 举报
六章节消息传递编程接口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页
点击查看更多>>
资源描述

《六章节消息传递编程接口MPI.ppt》由会员分享,可在线阅读,更多相关《六章节消息传递编程接口MPI.ppt(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,d

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

4、ECISION,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,数据类型

5、查询函数,MPI_TYPE_EXTENT(datatype, extent),MPI_TYPE_SIZE(datatype, size),MPI_TYPE_UB(datatype, displacement),MPI_TYPE_LB(datatype, displacement),详细用法见相关参考资料,12,新数据类型的创建,新数据类型创建函数,MPI_TYPE_CONTIGUOUS MPI_TYPE_VECTOR、MPI_TYPE_HVECTOR MPI_TYPE_INDEXED、MPI_TYPE_HINDEXED MPI_TYPE_STRUCT,新数据类型的提交:MPI_TYPE_COM

6、MIT,若使用新数据类型进行通信,则必须先提交 过渡数据类型不用提交,用完后就可直接释放,新数据类型的释放: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) . . .

7、. 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),15,MPI_TYPE_VECTOR,MPI_TYPE_VECTOR(

8、count,blocklen,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(typ

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

10、VECTOR 唯一区别为这里的 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,

13、position, comm),将缓冲区 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,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1