我在Stackoverflow上看到一篇关于mpi的简单程序的帖子:
在该程序中,用户试图广播一个等于20的char变量长度 使用MPI_BYTE mpi-type代替MPI_CHAR。
我正在尝试(可能不是很聪明)广播一个整数变量“n” 使用MPI_BYTE类型:
call MPI_BCAST(n,1,MPI_BYTE,0,MPI_COMM_WORLD,ierr)
但是当我为处理器打印“n”的值时,我得到了一个很大的数字 不同于根。
我的问题是我何时可以使用MPI_BYTE?
我已经读到它依赖于机器架构,但我仍然不明白这一点。
问候。
答案 0 :(得分:8)
您的问题很容易解决:您对MPI_BYTE
的使用(几乎)完全正常,但是要发送的元素大小/数量(在这种情况下:字节数)是错误的。
取决于整数的长度(例如4个字节),您必须将第二个参数设置为4:
call MPI_BCAST(n,4,MPI_BYTE,0,MPI_COMM_WORLD,ierr)
这里使用MPI_BYTE
或MPI_CHAR
无关紧要,因为两者的长度相同(这类似于unsigned char
与char
)。但是你必须记住,这在不同的架构之间不起作用。
要解决此问题,请使用正确的类型(MPI_INTEGER
)以确保(幕后)转换,例如从little endian到big endian:
call MPI_BCAST(n,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
答案 1 :(得分:4)
MPI消息传递功能要求消息类型的原因是MPI可以在源计算机和目标计算机之间执行表示转换。例如,当从使用little-endian数字表示的机器向使用big-endian的机器发送整数时,可以重新排列这些位以保留整数的原始值。
使用MPI_BYTE将阻止MPI执行任何类型的表示转换。当您想要保留完全相同的位序列时,这非常有用。我认为一个用例就是如果你逐位存储一个布尔数组(类似于std::vector<bool>
在C ++中的作用):在这种情况下,你不希望MPI随机乱转。