mpi_byte是如何工作的?

arm*_*ndo 3 c fortran mpi

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

简单的MPI计划

在该程序中,用户试图通过使用MPI_BYTE mpi类型而不是MPI_CHAR来广播等于20的char变量长度.

我正在尝试(可能不是很聪明)使用MPI_BYTE类型广泛转换整数变量"n":

call MPI_BCAST(n,1,MPI_BYTE,0,MPI_COMM_WORLD,ierr)
Run Code Online (Sandbox Code Playgroud)

但是当我为不同于root的处理器打印"n"的值时,我得到了一个很大的数字.

我的问题是我什么时候可以使用MPI_BYTE?

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

问候.

Mar*_*rio 8

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

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

call MPI_BCAST(n,4,MPI_BYTE,0,MPI_COMM_WORLD,ierr)
Run Code Online (Sandbox Code Playgroud)

无论你使用MPI_BYTEMPI_CHAR在这里都无关紧要,因为两者的长度相同(这就像unsigned char对战char).但是你必须记住,这在不同的架构之间不起作用.

要解决这个问题,请使用正确的type(MPI_INTEGER)来确保(在幕后)转换,例如从little endian到big endian:

call MPI_BCAST(n,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
Run Code Online (Sandbox Code Playgroud)


sus*_*att 4

MPI 消息传递函数询问消息类型的原因是,MPI 可以在源机器和目标机器之间执行表示转换。例如,当将整数从使用小端数字表示的机器发送到使用大端数字表示的机器时,可以重新排列这些位以保留整数的原始值。

使用 MPI_BYTE 将阻止 MPI 执行任何类型的表示转换。当您想要保留完全相同的位序列时,这会很有用。我认为一个用例是,如果您逐位存储布尔数组(类似于std::vector<bool>C++ 中的方式):在这种情况下,您不希望 MPI 打乱位。