`MPI_ERR_TRUNCATE: сообщение усечено` ошибка

Я столкнулся с проблемой, похожей на ту, что обсуждалась в этом разделе. код MPI, который суммирует строки вектора, который имеет определенное количество строк. Я прикрепляю код здесь.

Когда я пытаюсь скомпилировать с одним ядром онлайн 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 здесь. То же самое с 2 и 3 процессорами.

Может ли кто-нибудь помочь мне понять, в чем проблема? Я предполагаю, что я сделал ошибку в вызове MPI_RECV, связанном с «отправителем».


person Panichi Pattumeros PapaCastoro    schedule 17.01.2016    source источник
comment
Пожалуйста, вставьте свой код сюда. Если это MCVE, он должен легко помещаться.   -  person Jeff Hammond    schedule 17.01.2016


Ответы (1)


В коде было несколько проблем;

  1. Наиболее очевидной проблемой была синтаксическая ошибка с переменной приема, num_rows_to_receive. Вы получили строки, рассчитанные root_process в num_rows_to_received, но использовали переменную 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)

Это должно устранить ошибку.

  1. Вторая проблема (по крайней мере, я мог видеть это в своей системе) заключается в том, что тип данных MPI_REAL по умолчанию равен MPI_REAL4, а размер вектора усекается. Таким образом, мы не сможем получить реальную сумму всех элементов. Изменение mpi_real на MPI_REAL8 устранит проблему суммирования, и вы сможете получить точное значение суммирования для любого количества рангов. ~/temp$ mpirun -n 8 ./a.out please enter the number of numbers to sum: 500000 sum 1953156250.0000000 calculated by root process. partial sum 5859406250.0000000 returned from process 1 partial sum 9765656250.0000000 returned from process 2 partial sum 17578156250.000000 returned from process 4 partial sum 21484406250.000000 returned from process 5 partial sum 13671906250.000000 returned from process 3 partial sum 25390656250.000000 returned from process 6 partial sum 29296906250.000000 returned from process 7 The grand total is: 125000250000.00000
person naveen-rn    schedule 18.01.2016
comment
дайте мне ответ. Большое спасибо за это. Я ценю. Могу сказать, что вопрос можно закрыть, так как я получил ответ. Большое спасибо всем. - person Panichi Pattumeros PapaCastoro; 19.01.2016