Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mpi_字节是如何工作的?_C_Fortran_Mpi - Fatal编程技术网

C mpi_字节是如何工作的?

C mpi_字节是如何工作的?,c,fortran,mpi,C,Fortran,Mpi,我在Stackoverflow上看到了一篇关于mpi的简单程序的帖子: 在该程序中,用户试图广播长度等于20的字符变量 通过使用MPI_字节MPI类型而不是MPI_字符 我试图(可能不是很聪明)广义地转换一个整数变量“n” 使用MPI_字节类型: call MPI_BCAST(n,1,MPI_BYTE,0,MPI_COMM_WORLD,ierr) 但是,当我为处理器打印“n”的值时,我得到了一个很大的数字 与根不同 我的问题是什么时候可以使用MPI_字节 我已经读到它依赖于机器架构,但我仍然

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

在该程序中,用户试图广播长度等于20的字符变量 通过使用MPI_字节MPI类型而不是MPI_字符

我试图(可能不是很聪明)广义地转换一个整数变量“n” 使用MPI_字节类型:

call MPI_BCAST(n,1,MPI_BYTE,0,MPI_COMM_WORLD,ierr)
但是,当我为处理器打印“n”的值时,我得到了一个很大的数字 与根不同

我的问题是什么时候可以使用MPI_字节

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


注意。

MPI消息传递功能要求消息类型的原因是MPI可以在源计算机和目标计算机之间执行表示转换。例如,当从使用小尾数表示的机器向使用大尾数表示的机器发送整数时,可以重新排列位以保留整数的原始值


使用MPI_字节将阻止MPI执行任何类型的表示转换。当您希望保留完全相同的位序列时,这可能非常有用。我认为一个用例是,如果你一点一点地存储一个布尔数组(类似于C++中的
std::vector
):在这种情况下,你不想让MPI乱转位。

你的问题很容易解决:你对
MPI\u字节的使用(几乎)非常好,不管你的元素大小/数量如何(在本例中:字节数)发送错误

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

call MPI_BCAST(n,4,MPI_BYTE,0,MPI_COMM_WORLD,ierr)
无论您在这里使用的是
MPI\u字节
还是
MPI\u字符
,都无关紧要,因为两者的长度相同(这就像
无符号字符
字符
),但您必须记住,这在不同的体系结构之间不起作用

要解决此问题,请使用正确的类型(
MPI_INTEGER
)确保(在后台)转换,例如从小端到大端:

call MPI_BCAST(n,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)

我不是专家,但即使在同构系统中,字节和字符之间也有一个技术上的区别,即字节并不意味着与它们相关的任何算术运算。例如,可以减少字符数,但不能减少字节数。