MPI_Probe и MPI_Get_count могут возвращать неправильный счетчик для большого сообщения, созданного с использованием MPI_Type_contiguous - PullRequest
2 голосов
/ 13 апреля 2020

Я хочу отправлять большие сообщения в MPI, с более чем 2 ^ 31 B (или char, double или что-нибудь, но я буду использовать здесь байты). Суть в том, чтобы обойти ограничение int.

У меня есть этот код, который отправляет чуть больше 2 ^ 31 B, отправляя 2050 МБ. Я использую MPI_Probe и MPI_Get_count для динамического получения размера на стороне получателя и запуска кода на 2 ранга.

#include<mpi.h>
#include<stdio.h>
#include<vector>
#include<cassert>

using namespace std;

int main()
{

    MPI_Init(NULL, NULL);

    int size;
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    int my_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    MPI_Datatype MPI_MEGABYTE_TYPE;
    int mega = 1048576;
    MPI_Type_contiguous(mega, MPI_BYTE, &MPI_MEGABYTE_TYPE);
    MPI_Type_commit(&MPI_MEGABYTE_TYPE);

    int count = 2050;
    size_t length = static_cast<size_t>(mega) * static_cast<size_t>(count);
    vector<char> buffer(length);
    if(my_rank == 0) {
        MPI_Send(buffer.data(), count, MPI_MEGABYTE_TYPE, 1, 0, MPI_COMM_WORLD);
    } else {
        {
            MPI_Status mpi_status;
            int mpi_count = 0;
            MPI_Probe(0, 0, MPI_COMM_WORLD, &mpi_status);
            MPI_Get_count(&mpi_status, MPI_MEGABYTE_TYPE, &mpi_count);
            printf("get count before = %d\n", mpi_count);
        }
        {
            MPI_Status mpi_status;
            int mpi_count = 0;
            MPI_Recv(buffer.data(), count, MPI_MEGABYTE_TYPE, 0, 0, MPI_COMM_WORLD, &mpi_status);
            MPI_Get_count(&mpi_status, MPI_MEGABYTE_TYPE, &mpi_count);
            printf("get count after = %d\n", mpi_count);
        }
    }

    MPI_Finalize();
}

В зависимости от используемой реализации MPI, я обычно получаю (как с MPICH 3.3.2 или OpenMPI 4.0.3 для Ma c или с другими версиями OpenMPI в кластере linux

get count before = 2050
get count after = 2050

, но иногда (в частности, с MVAPICH2-2.3 MPI для некоторых * 1022) * cluster) Я получаю

get count before = 2048
get count after = 2050

Правильно ли я сказал, что 2048 неверно (следовательно, в реализации есть ошибка) и должно быть 2050? 2050 год кажется очевидным правильным ответом, но иногда MPI сложно. Я мог что-то пропустить. Я не смог найти четкого ответа в стандартном https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf для MPI_Get_count при использовании составных типов данных.

...