MS MPI неправильные данные при Send struct

116
07 июня 2019, 01:20

Я объявил кастомную структуру для использования в send/recv.

Сама структура:

enum RequestType {INSERT, UPDATE};
struct Request{
    RequestType requestType;
    char node1[MAX_CHAR];
    char node2[MAX_CHAR];
    char value[MAX_CHAR];
}

Регистрируем ее в MPI

Request req;
MPI_Datatype reqTypeMPI;
MPI_Datatype reqType[4] = { MPI_INTEGER, MPI_CHAR, MPI_CHAR, MPI_CHAR };
int blocklen[4] = { 1, MAX_CHAR, MAX_CHAR, MAX_CHAR };
MPI_Aint disp[4];
MPI_Get_address(&req.requestType, &disp[0]);
MPI_Get_address(&req.node1, &disp[1]);
MPI_Get_address(&req.node2, &disp[2]);
MPI_Get_address(&req.value, &disp[3]);
disp[3] = disp[3] - disp[2];
disp[2] = disp[2] - disp[1];
disp[1] = disp[1] - disp[0];
disp[0] = 0;
MPI_Type_create_struct(4, blocklen, disp, reqType, &reqTypeMPI);
MPI_Type_commit(&reqTypeMPI);

Далее делаем просто send/recv

// send
Request request;
strcpy_s(request.node1, node1.c_str());
strcpy_s(request.node2, node2.c_str());
strcpy_s(request.value, value.c_str());
request.requestType = INSERT;
MPI_Send(&request, 1, requestDatatype, 1, 1, MPI_COMM_WORLD);
// recv
Request request;
MPI_Status status;
MPI_Recv(&request, 1, requestDatatype, 0, MPI_ANY_TAG, MPI_COMM_WORLD, 
&status);

Все данные передаются корректно, кроме поля value. Например, пусть node1 = "node", node2 = "node2", value = "value", requestType = INSERT. Тогда в результате я получаю:

Что я делаю неправильно?

READ ALSO
Вызов деструктора для объекта в его методе

Вызов деструктора для объекта в его методе

Насколько безопасна такая вещь:

128
распознавание Aruco меток

распознавание Aruco меток

Нужно реализовать распознавание Aruco меток под наклоном по трём осямПроблема заключается в методе

103
С++ Почему ошибка при передачи указателя на двумерный массив в функцию?

С++ Почему ошибка при передачи указателя на двумерный массив в функцию?

Нужно передать в функцию указатель на двумерный массивСделал это, как было предложено в одном из ответов вот тут

128
Почему выдаёт ошибку и как её исправить?

Почему выдаёт ошибку и как её исправить?

Почему выдаёт ошибку и как её исправить?

111