`MPI_ERR_TRUNCATE: 消息被截断` 错误
`MPI_ERR_TRUNCATE: message truncated` error
我遇到的问题与讨论的问题类似 in this topic, I have a MPI code which sum the lines of a vector which has a specific number of lines. I attach the code here。
当我尝试用一个核心在线编译时mpirun -n 1 ./program
我得到:
500000 sum 125000250000.00000 calculated by root process.
The grand total is: 125000250000.00000
因为我只有一个计算总和的核心,所以看起来还不错。但是当我尝试使用多核时 mpirun -n 4 ./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 程序红色了类似的问题 here。 2 个和 3 个处理器也是如此。
有人可以帮我找出问题所在吗?我的猜测是我在与 "sender".
相关的 MPI_RECV 调用中犯了一个错误
代码中有几个问题;
- 最明显的问题是接收变量的语法错误,num_rows_to_receive。您已收到 num_rows_to_received 中 root_process 计算的行,但使用了变量 num_rows_to_receive用于实际接收矢量。
CALL mpi_recv (num_rows_to_receive, 1 , mpi_integer,
root_process, mpi_any_tag, mpi_comm_world,
STATUS, ierr)
CALL mpi_recv (vector2, num_rows_to_receive, mpi_real8, root_process,
mpi_any_tag, mpi_comm_world, STATUS, ierr)
这应该可以解决错误。
- 第二个问题(至少我可以在我的系统上看到)是 MPI_REAL 数据类型默认为 MPI_REAL4 并且向量的大小被截断了。所以我们将无法收到所有元素的实际总和。将 mpi_real 更改为 MPI_REAL8 将解决求和问题,您可以获得所有任意数量等级的精确求和值。
~/temp$ mpirun -n 8 ./a.out
请输入要求和的数字个数:
500000
总和 1953156250.0000000 由根进程计算。
从流程 1 返回的部分金额 5859406250.0000000
从过程 2 返回的部分和 9765656250.0000000
从过程 4 返回的部分和 17578156250.000000
从流程 5 返回的部分金额 21484406250.000000
从流程 3 返回的部分金额 13671906250.000000
从过程 6 返回的部分和 25390656250.000000
从流程 7 返回的部分金额 29296906250.000000
总计为:125000250000.00000<br>
我遇到的问题与讨论的问题类似 in this topic, I have a MPI code which sum the lines of a vector which has a specific number of lines. I attach the code here。
当我尝试用一个核心在线编译时mpirun -n 1 ./program
我得到:
500000 sum 125000250000.00000 calculated by root process.
The grand total is: 125000250000.00000
因为我只有一个计算总和的核心,所以看起来还不错。但是当我尝试使用多核时 mpirun -n 4 ./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 程序红色了类似的问题 here。 2 个和 3 个处理器也是如此。
有人可以帮我找出问题所在吗?我的猜测是我在与 "sender".
相关的 MPI_RECV 调用中犯了一个错误代码中有几个问题;
- 最明显的问题是接收变量的语法错误,num_rows_to_receive。您已收到 num_rows_to_received 中 root_process 计算的行,但使用了变量 num_rows_to_receive用于实际接收矢量。
CALL mpi_recv (num_rows_to_receive, 1 , mpi_integer, root_process, mpi_any_tag, mpi_comm_world, STATUS, ierr) CALL mpi_recv (vector2, num_rows_to_receive, mpi_real8, root_process, mpi_any_tag, mpi_comm_world, STATUS, ierr)
这应该可以解决错误。
- 第二个问题(至少我可以在我的系统上看到)是 MPI_REAL 数据类型默认为 MPI_REAL4 并且向量的大小被截断了。所以我们将无法收到所有元素的实际总和。将 mpi_real 更改为 MPI_REAL8 将解决求和问题,您可以获得所有任意数量等级的精确求和值。
~/temp$ mpirun -n 8 ./a.out 请输入要求和的数字个数: 500000 总和 1953156250.0000000 由根进程计算。 从流程 1 返回的部分金额 5859406250.0000000 从过程 2 返回的部分和 9765656250.0000000 从过程 4 返回的部分和 17578156250.000000 从流程 5 返回的部分金额 21484406250.000000 从流程 3 返回的部分金额 13671906250.000000 从过程 6 返回的部分和 25390656250.000000 从流程 7 返回的部分金额 29296906250.000000 总计为:125000250000.00000<br>