лучший способ отправить данные (в байтах) процессу в openMPI?

Я делаю так,
Предположим, мне нужно отправить временное количество байтов корневому процессу:

var char*;
var=new char[temp];
MPI_Isend(&temp,1,MPI_INT,0,tag,MPI_COMM_WORLD,&request[0]);
MPI_Isend(var,temp,MPI_BYTE,0,tag,MPI_COMM_WORLD,&request[1]);

и на корневой процесс, я пишу этот код,

MPI_Recv(&temp,1,MPI_INT,i,tag,MPI_COMM_WORLD,&status[0]);
var=new char[temp];
MPI_Recv(var,temp,MPI_BYTE,0,tag,MPI_COMM_WORLD,&status[1]);

Я могу получить temp (количество байтов данных для передачи) в корневой процесс и вижу ошибку усеченного сообщения для следующей части?

1

Решение

Вы получаете из неправильного местоположения:

MPI_Recv(var,temp,MPI_BYTE,0,tag,MPI_COMM_WORLD,&status[1]);
^

Вы должны получать от (предположительно), i процесс.

1

Другие решения

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

Отправитель:

char *var = new char[temp];
MPI_Send(var, temp, MPI_BYTE, 0, tag, MPI_COMM_WORLD);

Получатель:

MPI_Status status;
int temp;
// Probe for matching message without receiving it
MPI_Probe(i, tag, MPI_COMM_WORLD, &status);
// Get the number of data elements in the message
MPI_Get_count(&status, MPI_BYTE, &temp);
char *var = new char[temp];
MPI_Recv(var, temp, MPI_BYTE, i, tag, MPI_COMM_WORLD, &status);

Это гораздо более оптимальный способ передачи массивов разного размера.

3

По вопросам рекламы [email protected]