1 MPI预定义数据类型
MPI预定义数据类型 | 相应的C数据类型 |
---|---|
MPI_CHAR | signed char |
MPI_SHORT | signed short int |
MPI_INT | signed int |
MPI_LONG | signed long int |
MPI_UNSIGNED_CHAR | unsigned char |
MPI_UNSIGNED_SHORT | unsigned short int |
MPI_UNSIGNED | unsigned int |
MPI_UNSIGNED_LONG | unsigned long int |
MPI_FLOAT | float |
MPI_DOUBLE | double |
MPI_LONG_DOUBLE | long double |
MPI_BYTE | 无对应类型 |
MPI_PACKED | 无对应类型 |
MPI_BYTE的一个值由一个字节组成(8个二进制位)
附加的MPI数据类型 | 相应的C数据类型 |
---|---|
MPI_LONG_LONG_INT | long long int |
2 MPI数据类型匹配和数据转换
-
MPI类型匹配规则
消息装配,消息传递,消息拆卸三个阶段都需要类型匹配
宿主语言的类型和通信操作所指定的类型相匹配,发送方和接收方的类型相匹配
(MPI认为MPI_INT和MPI_LONG是不同的类型)
例外:MPI_BYTE和MPI_PACKED和人和任何以字节为单位的存储相匹配。
MPI_BYTE用于不加修改地传送内存中的二进制值,
MPI_PACK用于数据的打包和解包(MPI_UNPACK)
总结:
- 有类型数据的通信:发送方接收方均使用相同的数据类型
- 无类型数据的通信:发送方接收方均以MPI_BYTE作为数据类型
- 打包数据的通信:均使用MPI_PACKED
-
数据转换
- 数据类型的转换:比如将实型转换为整型(通过舍入操作)
- 数据表示的转换:改变一个值的二进制表示,比如高字节和低字节顺序的改变,将浮点数从32位表示改变为64位表示等
MPI不存在数据类型转换,但实现数据表示的转换。
3 MPI消息
-
MPI消息的组成
- 信封:<源/目,标识,通信域>
- 数据:<起始地址,数据个数,数据类型>
标识的作用:当发送者发送两个相同类型的数据给同一个接收者时,标识用于区分这两个消息
-
任意源和任意标识
MPI_ANY_SOURCR
MPI_ANY_TAG
可以同时使用或分别单独使用,
但不能给comm指定任意值。
一个接收操作可以接收任何发送者的消息,但对于一个发送操作,则必须指明一个单独的接收者。
MPI允许发送者=接收者,但要注意死锁的产生
-
MPI通信域
- 进程组,编号:0到N-1
- 通信上下文:提供一个相对独立的通信区域,不同的消息在不同的上下文中进行传递,不同上下文的消息互不干涉,通信上下文可以将不同的通信区别开来。
预定义的通信域:MPI_COMM_WORLD
用户可以在原有通信域的基础上,定义新的通信域