mpi_byte是如何工作的?

时间:2012-03-27 18:31:55

标签: c fortran mpi

我在Stackoverflow上看到一篇关于mpi的简单程序的帖子:

Simple MPI Program

在该程序中,用户试图广播一个等于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?

我已经读到它依赖于机器架构,但我仍然不明白这一点。

问候。

2 个答案:

答案 0 :(得分:8)

您的问题很容易解决:您对MPI_BYTE的使用(几乎)完全正常,但是要发送的元素大小/数量(在这种情况下:字节数)是错误的。

取决于整数的长度(例如4个字节),您必须将第二个参数设置为4:

call MPI_BCAST(n,4,MPI_BYTE,0,MPI_COMM_WORLD,ierr)

这里使用MPI_BYTEMPI_CHAR无关紧要,因为两者的长度相同(这类似于unsigned charchar)。但是你必须记住,这在不同的架构之间不起作用。

要解决此问题,请使用正确的类型(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随机乱转。