Fortran `MPI_error_TRUNCATE:消息截断`错误
我遇到了一个与前面讨论的问题类似的问题,我有一个MPI代码,它对一个向量的行进行求和,这个向量有特定的行数。我附上 当我尝试在线编译一个核心Fortran `MPI_error_TRUNCATE:消息截断`错误,fortran,mpi,fortran90,gfortran,openmpi,Fortran,Mpi,Fortran90,Gfortran,Openmpi,我遇到了一个与前面讨论的问题类似的问题,我有一个MPI代码,它对一个向量的行进行求和,这个向量有特定的行数。我附上 当我尝试在线编译一个核心mpirun-n1./program时,我得到: please enter the number of numbers to sum: 500000 [federico-C660:9540] *** An error occurred in MPI_Recv [federico-C660:9540] *** on communicator MPI_COMM_
mpirun-n1./program
时,我得到:
please enter the number of numbers to sum:
500000
[federico-C660:9540] *** An error occurred in MPI_Recv
[federico-C660:9540] *** on communicator MPI_COMM_WORLD
[federico-C660:9540] *** MPI_ERR_TRUNCATE: message truncated
[federico-C660:9540] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
sum 7812562500.0000000 calculated by root process.
--------------------------------------------------------------------------
mpirun has exited due to process rank 1 with PID 9539 on
node XXXXX1 exiting without calling "finalize".
500000总计125000250000.00000,由根进程计算。
总计为:125000250000.00000
因为我只有一个计算和的核,看起来还可以。但当我尝试使用多核mpirun-n4./program
时,我得到:
please enter the number of numbers to sum:
500000
[federico-C660:9540] *** An error occurred in MPI_Recv
[federico-C660:9540] *** on communicator MPI_COMM_WORLD
[federico-C660:9540] *** MPI_ERR_TRUNCATE: message truncated
[federico-C660:9540] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
sum 7812562500.0000000 calculated by root process.
--------------------------------------------------------------------------
mpirun has exited due to process rank 1 with PID 9539 on
node XXXXX1 exiting without calling "finalize".
我也为C程序解决了类似的问题。与2和3处理器相同
有人能帮我找出问题所在吗?我猜我在与“发件人”相关的MPI_RECV调用中犯了一个错误
最明显的问题是接收变量num_rows_to_receive的语法错误。您已收到根进程在num_rows_to_received中计算的行,但使用变量num_rows_to_receive实际接收向量。
调用mpi_recv(num_rows_to_receive,1,mpi_integer,
根进程、mpi任意标记、mpi通信世界、,
地位(ierr)
调用mpi_recv(vector2、num_rows_to_receive、mpi_real8、root_进程、,
mpi_任意标签、mpi_通信世界、状态、ierr)
这应该可以解决错误
第二个问题(至少在我的系统上可以看到)是MPI_REAL数据类型默认为MPI_REAL4,并且向量的大小被截断。所以我们无法得到所有元素的实际总和。将mpi_real更改为mpi_REAL8将解决求和问题,并且您可以获得所有任意数量列的精确求和值。
~/temp$mpirun-n 8./a.out
请输入要求和的数字数:
500000
根进程计算的和1953156250.0000000。
从进程1返回的部分和5859406250.0000000
从进程2返回的部分和97656250.0000000
从进程4返回的部分和17578156250.000000
从进程5返回的部分和21484406250.000000
从进程3返回的部分和13671906250.000000
从进程6返回的部分和25390656250.000000
从进程7返回的部分和29296906250.000000
总计为:125000250000.00000
请在这里内联您的代码。如果是MCVE,它应该很容易安装。给我答案。非常感谢。我很感激。我可以说这个问题可以结束了,因为我得到了答案。非常感谢大家。