中国料学火计算机科学与波术系 niversity of Science and Technolo ogy of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr lMP中的消息 为什么需要定义消息数据类型? 理由有两个: 是支持异构计算 另一是允许非连续,非均匀内存区中的消息 异构计算( heterogeneous computing):指的是在由不同计算机, 如工作站网络,组成的系统上运行应用程序.系统中的每台计 算机可能由不同的厂商生产、使用不同的处理器和操作系统 当这些计算机使用不同的数据表示时如何保证互操作性 国家高性能计算中心(合肥
国家高性能计算中心(合肥) 理由有两个: • 一是支持异构计算 • 另一是允许非连续, 非均匀内存区中的消息. 异构计算(heterogeneous computing ): 指的是在由不同计算机, 如工作站网络, 组成的系统上运行应用程序. 系统中的每台计 算机可能由不同的厂商生产、使用不同的处理器和操作系统 当这些计算机使用不同的数据表示时如何保证互操作性. 为什么需要定义消息数据类型? 1 MPI中的消息
中国料学火计算机科学与波术系 niversity of Science and Technolo ogy of China DEAT三 NT OF C口 MPUTER SCIENGE AND TECHNOLOr lMP中的消息 表1MPI中预定义的数据类型 MPI(C语言绑定) C MPI( Fortran语言绑定) Fortran MPI BYTE MPI BYTE MPI CHAR signed char MPI CHARACTER CHARACTER MPI COMPLEX COMPLEX MPI DOUBLE double MPI DOUBLE PRECISION DOUBLE PRECISION MPI FLOAT float MPI REAL REAL MPI INT Int MPI INTEGER INTEGER MPI LOGICAL LOGICAL MPI LONG ong MPI LONG DOUBLE long double MPI PACKED MPI PACKED MPI SHORT short MPI_ UNSIGNED_CHAR unsigned char MPI UNSIGNED unsigned int MPI_ UNSIGNED_ LONG unsigned long MPI UNSIGNED SHORT unsigned short
国家高性能计算中心(合肥) 表 1 MPI 中预定义的数据类型 MPI(C 语言绑定) C MPI(Fortran 语言绑定) Fortran MPI_BYTE MPI_ BYTE MPI_CHAR signed char MPI_CHARACTER CHARACTER MPI_COMPLEX COMPLEX MPI_DOUBLE double MPI_DOUBLE_PRECISION DOUBLE_PRECISION MPI_FLOAT float MPI_REAL REAL MPI_INT int MPI_INTEGER INTEGER MPI_LOGICAL LOGICAL MPI_LONG long MPI_LONG_DOUBLE long double MPI_PACKED MPI_PACKED MPI_SHORT short MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long MPI_UNSIGNED_SHORT unsigned short 1 MPI中的消息
中国料学火计算机科学与波术系 例2发送非连续数据项 jechnology of China 1EN三AND了E已问 noLdor double a100: MPI Pack size(50, MPI DOUBLE, comm, BufferSize); Temp Buffer= malloc(Buffersize) j=sizeof(MPI DOUBLE); Position =0; for(i=0;<50;i++) MPI Pack(A+ij, 1, MPI DOUBLE, TempBuffer BufferSize, Position, comm); MPI Send(TempBuffer Position, MPI PACKED, destinatio n, tag, comm); 例程 说明 MPI Pack size 决定需要一个多大的临时缓冲区来存放50个 MPI DOUBLE 数据项 malloc(BufferSize) 为缓冲区 Temp Buffer动态分配内存 for循环 将数组A的50个偶序数元素打成一个包,放在 TempBuffer 中 MPI Pack 第一个参数是被打包的数组元素的地址 (A+i*j,1, MPI DOUBLE, Temp Buffe. BufferSize 第三个参数是被打包的数组元素的数据类型, &Position, comm) position用于跟踪已经有多少个数据项被打包. position的 最后值在接下来的 MPI Send中被用作消息计数
国家高性能计算中心(合肥) 例2 发送非连续数据项 例 程 说 明 MPI_Pack_size 决定需要一个多大的临时缓冲区来存放50个MPI_DOUBLE 数据项 malloc (BufferSize) 为缓冲区 TempBuffer 动态分配内存 for 循环 将数组 A 的 50 个偶序数元素打成一个包, 放在 TempBuffer 中 MPI_Pack (A+i*j, 1, MPI_DOUBLE, TempBuffe,BufferSize, &Position, comm); 第一个参数是被打包的数组元素的地址. 第三个参数是被打包的数组元素的数据类型, position 用于跟踪已经有多少个数据项被打包. position的 最后值在接下来的MPI_Send中被用作消息计数. double A[100]; MPI_Pack_size (50,MPI_DOUBLE,comm,&BufferSize); TempBuffer = malloc(BufferSize); j = sizeof(MPI_DOUBLE); Position = 0; for (i=0;i<50;i++) MPI_Pack(A+i*j,1,MPI_DOUBLE,TempBuffer,BufferSize,&Position,comm); MPI_Send(TempBuffer,Position,MPI_PACKED,destination,tag,comm);
中国斜受 例3在消息传递中发送一个混合数据类型 在下面的消息中,假定每个双精度数有8字节长,一个字符是1字节,一个 整型数是4字节 序号 要发送的消息 消息的性质与定义方法 (1)由数组A的所有元素组成的消息A有100个元素,每个元这两个消息有两个性质 素是一个双精度数 数据项的存放是连续的 这个消息由100项组成,每项有一个 double数据类型,决·所有的数据项具有相同的数据类型 定了每一项的大小是8字节第ⅱ项的起始地址是A+8(1)这类消息可以方便地用三元组 (2)由数组A的第3和第4项组成消息 (address, count, datatype) 这个消息由两项A和AB3组成每项是一个 double数据来定义 类型,第一项始于A+16,第二项始于A+24 第(1)个消息可以用(A100, MPI DOUBLE)来定义 第(2)个消息可以用(A+16,2 MPI DOUBLE)来定义 (3)由数组A的所有偶序数项组成的消息 第(3)个消息的性质 这个消息由50项ApA[2]A[41,…,A[98组成每一项有数据项没有放在一个连续的存储区中 个 double数据类型.第i项的起始地址是A+16(i-1) (4) 由数组A的第3项,后跟一个字符c,再跟一个整型数k第(4)个消息的性质 这个消息由三个不同类型的数据组成假定它是一个数据数据不仅没有连续存放,而且是混合数据类型 结构 上述简单的方法不能处理第(3)和第(4)个消息 struct( double a[100]; char b, c; int j, k, ) S MPI引入导出数据类型 (derived data type)的概念,允 的一部分那么第一项A2]的地址是S+16,第二项c的地/许定义可能是由混合数据类型、非连续存放的数据 址是S+801,第三项k的地址是S+806 项组成的消息导出数据类型由用户的应用程序在运 行时从基本的数据类型构造.MPI提供了强大而全面 的构造复杂数据类型的子例程
国家高性能计算中心(合肥) 在下面的消息中, 假定每个双精度数有8字节长, 一个字符是1字节, 一个 整型数是4字节. 序号 要发送的消息 消息的性质与定义方法 (1) 由数组 A 的所有元素组成的消息. A 有 100 个元素, 每个元 素是一个双精度数. 这个消息由 100 项组成, 每项有一个 double 数据类型, 决 定了每一项的大小是 8 字节. 第 i 项的起始地址是 A+8(i-1). (2) 由数组 A 的第 3 和第 4 项组成消息. 这个消息由两项 A[2]和 A[3]组成. 每项是一个 double 数据 类型, 第一项始于 A+16, 第二项始于 A+24. 这两个消息有两个性质: 数据项的存放是连续的; 所有的数据项具有相同的数据类型. 这类消息可以方便地用三元组 (address, count, datatype) 来定义. 第(1)个消息可以用 (A, 100, MPI_DOUBLE) 来定义. 第(2)个消息可以用 (A+16,2,MPI_DOUBLE) 来定义. (3) 由数组 A 的所有偶序数项组成的消息. 这个消息由 50 项 A[0],A[2],A[4], ..., A[98]组成. 每一项有 一个 double 数据类型. 第 i 项的起始地址是 A+16(i-1). (4) 由数组 A 的第 3 项, 后跟一个字符 c, 再跟一个整型数 k. 这个消息由三个不同类型的数据组成. 假定它是一个数据 结构: struct{ double A[100]; char b,c; int j,k;} S 的一部分. 那么第一项 A[2]的地址是 S+16, 第二项 c 的地 址是 S+801, 第三项 k 的地址是 S+806. 第(3)个消息的性质: 数据项没有放在一个连续的存储区中. 第(4)个消息的性质: 数据不仅没有连续存放, 而且是混合数据类型. 上述简单的方法不能处理第(3)和第(4)个消息. MPI 引入导出数据类型(derived data type )的概念, 允 许定义可能是由混合数据类型、非连续存放的数据 项组成的消息. 导出数据类型由用户的应用程序在运 行时从基本的数据类型构造. MPI 提供了强大而全面 的构造复杂数据类型的子例程. 例 3 在消息传递中发送一个混合数据类型
中国料学火计算机科学与波术系 versity of Science and Technology of ChirN6f 例4发送一数组的所有偶序数元素 double a 100; MPI Data type Even Elements; MPI Type vector(50, 1, 2, MPI DOUBLE, &Even Elements) MPI Type commit(& EvenElements) MPI Send(A, 1, Even Elements, destination, ) 例程 说明 MPI Data type 声明一个新的数据类型 Evenelements MPI Type vector(50,12. MPI DOUBLE&E产生一个导出数据类型 EvenElements,它由50个块组成 venElements) 每个块的组成是一个双精度数,后跟一个8字节的间隔 接在后面的是下一块. stride是两个双精度数的大小,即 16字节.8字节的间隔用于跳过数组A的奇序数元素 MPI Type commit(&Even Elements) 这个新类型必须在被发送例程使用前交付使用 MPI Send( A, 1, Even Elements, destination,…)注意: Even Elements的一个元素包含A的所有50个偶序 数元素.因此, MPI Send的 count域值为1 国家高性能计算中心(合肥
国家高性能计算中心(合肥) 例4 发送一数组的所有偶序数元素 例 程 说 明 MPI_Data_type 声明一个新的数据类型 EvenElements. MPI_Type_vector(50,1,2,MPI_DOUBLE,&E venElements) 产生一个导出数据类型 EvenElements, 它由 50 个块组成. 每个块的组成是一个双精度数, 后跟一个 8 字节的间隔, 接在后面的是下一块. stride 是两个双精度数的大小, 即 16 字节. 8 字节的间隔用于跳过数组 A 的奇序数元素. MPI_Type_commit(&EvenElements) 这个新类型必须在被发送例程使用前交付使用. MPI_Send(A,1,EvenElements,destination, ...) 注意: EvenElements 的一个元素包含 A 的所有 50 个偶序 数元素. 因此, MPI_Send 的 count 域值为 1. double A[100]; MPI_Data_type EvenElements; ... ... MPI_Type_vector(50,1,2,MPI_DOUBLE,&EvenElements); MPI_Type_commit(&EvenElements); MPI_Send(A,1,EvenElements,destination, ...);