Я хочу отправлять большие сообщения в 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 при использовании составных типов данных.