MPI_Gatherv, Неустранимая ошибка в MPI_Gatherv: ожидающий запрос (без ошибки), стек ошибок:

#c #mpi

#c #mpi

Вопрос:

ПРАВКА #1:

итак, РЕШЕНИЕ:

строка

 MPI_Gatherv(buffer, rank, MPI_INT, buffer, receive_counts, receive_displacements, MPI_INT, 0, MPI_COMM_WORLD);
  

необходимо изменить на

 MPI_Gatherv(buffer, receive_counts[rank], MPI_INT, buffer, receive_counts, receive_displacements, MPI_INT, 0, MPI_COMM_WORLD);
  

еще раз спасибо за помощь


ОРИГИНАЛЬНОЕ СООБЩЕНИЕ:

мой код из DeinoMPI

когда я запускаю mpiexec -localonly 4 skusamGatherv.exe , все в порядке.

если я изменю строку

int receive_counts[4] = { 0, 1, 2, 3 };

Для

int receive_counts[4] = { 0, 1, 2, 1 };

компиляция все еще в порядке, но когда я запускаю mpiexec -localonly 4 skusamGatherv.exe Я получу ошибку

Я думаю, что это сработает

Спасибо за помощь


Я получу ошибку:

 Fatal error in MPI_Gatherv: Message truncated, error stack:
MPI_Gatherv(363)........................: MPI_Gatherv failed(sbuf=0012FF4C, scou
nt=0, MPI_INT, rbuf=0012FF2C, rcnts=0012FEF0, displs=0012FED8, MPI_INT, root=0,
MPI_COMM_WORLD) failed
MPIDI_CH3_PktHandler_EagerShortSend(351): Message from rank 3 and tag 4 truncate
d; 12 bytes received but buffer size is 4
unable to read the cmd header on the pmi context, Error = -1
.
0. [0][0][0][0][0][0] , [0][0][0][0][0][0]
Error posting readv, An existing connection was forcibly closed by the remote ho
st.(10054)
unable to read the cmd header on the pmi context, Error = -1
.
Error posting readv, An existing connection was forcibly closed by the remote ho
st.(10054)
1. [1][1][1][1][1][1] , [0][0][0][0][0][0]
unable to read the cmd header on the pmi context, Error = -1
.
Error posting readv, An existing connection was forcibly closed by the remote ho
st.(10054)
2. [2][2][2][2][2][2] , [0][0][0][0][0][0]
unable to read the cmd header on the pmi context, Error = -1
.
Error posting readv, An existing connection was forcibly closed by the remote ho
st.(10054)
3. [3][3][3][3][3][3] , [0][0][0][0][0][0]

job aborted:
rank: node: exit code[: error message]
0: jan-pc-nb: 1: Fatal error in MPI_Gatherv: Message truncated, error stack:
MPI_Gatherv(363)........................: MPI_Gatherv failed(sbuf=0012FF4C, scou
nt=0, MPI_INT, rbuf=0012FF2C, rcnts=0012FEF0, displs=0012FED8, MPI_INT, root=0,
MPI_COMM_WORLD) failed
MPIDI_CH3_PktHandler_EagerShortSend(351): Message from rank 3 and tag 4 truncate
d; 12 bytes received but buffer size is 4
1: jan-pc-nb: 1
2: jan-pc-nb: 1
3: jan-pc-nb: 1
Press any key to continue . . .
  

Мой код:

 #include "mpi.h"
#include <stdio.h>

int main(int argc, char *argv[])
{
    int buffer[6];
    int rank, size, i;
    int receive_counts[4] = { 0, 1, 2, 3 };
    int receive_displacements[4] = { 0, 0, 1, 3 };

    MPI_Init(amp;argc, amp;argv);
    MPI_Comm_size(MPI_COMM_WORLD, amp;size);
    MPI_Comm_rank(MPI_COMM_WORLD, amp;rank);
    if (size != 4)
    {
        if (rank == 0)
        {
            printf("Please run with 4 processesn");fflush(stdout);
        }
        MPI_Finalize();
        return 0;
    }
    for (i=0; i<rank; i  )
    {
        buffer[i] = rank;
    }
    MPI_Gatherv(buffer, rank, MPI_INT, buffer, receive_counts, receive_displacements, MPI_INT, 0, MPI_COMM_WORLD);
    if (rank == 0)
    {
        for (i=0; i<6; i  )
        {
            printf("[%d]", buffer[i]);
        }
        printf("n");
        fflush(stdout);
    }
    MPI_Finalize();
    return 0;
}
  

Ответ №1:

Сделайте шаг назад и рассмотрите, что делает MPI_Gatherv: это MPI_Gather (в данном случае с рангом 0), где каждый процессор может отправлять разные объемы данных.

В вашем примере ранг 0 отправляет 0 целых чисел, ранг 1 отправляет 1 целое число, ранг 2 отправляет 2 целых числа, а ранг 3 отправляет 3 целых числа.

 MPIDI_CH3_PktHandler_EagerShortSend(351): Message from rank 3 and tag 4 truncated; 12 bytes received but buffer size is 4
  

он скрыт под множеством другой информации, но в нем говорится, что 3-й ранг отправил 3 целых числа (12 байт), но в 0-м ранге было место только для 1 целого числа.

Посмотрите на первые три аргумента для gatherv: ‘buffer, rank, MPI_INT’. Независимо от того, что вы установили для приема, ранг 3 всегда будет отправлять 3 целых числа.

обратите внимание, что вы можете недополнить буфер (вы могли бы создать, скажем, последний элемент из receive_counts 100), но вы сказали библиотеке MPI с меньшим значением receive_counts[3] ожидать только 1 int, хотя вы отправили 3.

Комментарии:

1. спасибо, этот ранг в качестве аргумента меня смутил, я принял его за то, откуда он отправлен, и это размер отправленных данных

2. ну, просто для пояснения, кортеж «буфер, количество, тип данных» часто отображается в MPI. Этот кортеж описывает местоположение и размер памяти.