Я пытаюсь отправить некоторые данные от работников в мастер (рейтинг 0) в программе MPI в C++. Цель состоит в том, чтобы передать 2 строки и целое число. Для этого я создал структуру.
Структура
Он называется словом и определяется следующим образом:
struct word
{
char word_name[str_size];
char url[str_size];
int counter;
};
/* Some important variables to the question */
MPI_Datatype mpi_word_type;
const int str_size = 200;
Раньше я пробовал это через char *
но он не работает, поскольку процессы не используют одно и то же пространство памяти.
К настоящему моменту я могу отправить структуру, если я изменил переменные из char[]
на простой char
и попробую пример. С этим, как и выше, я не могу избавиться от ошибок ошибки сегментации.
Отправка части - работники
Сначала я создаю и заполняю примерную структуру, а затем отправляю сначала размер структуры и структуру, во-вторых. Как это:
word word_col;
std::string tmp = "somename";
strcpy(word_col.word_name, tmp.c_str());
std::string tmp2 = "someurl";
strcpy(word_col.url, tmp2.c_str());
word_col.counter = 10;
int size = sizeof(word_col);
MPI::COMM_WORLD.Send(&size, 1, MPI::INT, 0, 1);
MPI::COMM_WORLD.Send(&word_col, size, mpi_word_type, 0, 1);
Приемная часть - Мастер
const int nitems = 3;
int blocklengths[3] = { str_size, str_size, 1 };
MPI_Datatype types[3] = { MPI::CHAR, MPI::CHAR, MPI::INT };
MPI_Aint offsets[3];
offsets[0] = (MPI_Aint) offsetof(struct word, word_name);
offsets[1] = (MPI_Aint) offsetof(struct word, url);
offsets[2] = (MPI_Aint) offsetof(struct word, counter);
MPI_Type_create_struct(nitems, blocklengths, offsets, types, &mpi_word_type);
MPI_Type_commit(&mpi_word_type);
...
for(...)
{
word word_col;
int size;
MPI::COMM_WORLD.Recv(&size, 1, MPI::INT, MPI::ANY_TAG, 1, status);
MPI::COMM_WORLD.Recv(&word_col, size, mpi_word_type, MPI::ANY_TAG, 1, status);
}
Я боролся с этим часами, и я видел много примеров и другие вопросы об этом, но я не мог понять, в чем проблема.
Это ошибочное программирование. У вас есть нераспределенный и неинициализированный указатель, и вы пытаетесь подталкивать данные к этому. У вас есть два варианта: либо вы определяете свою структуру как:
const int str_size = 200;
struct word
{
char word_name[str_size]; // fixed sized char array
char url[str_size]; // fixed sized char array
int counter;
};
Или,
const int str_size = 200;
struct word
{
char *word_name; /
char *url;
int counter;
Word() {
word_name = new char[str_size];
url = new char[str_size];
}
~Word() {
delete [] word_name;
delete [] url;
}
};
Идея состоит в том, что вам необходимо выделить память для этих переменных. Кроме того, при получении вы использовали:
MPI::COMM_WORLD.Recv(&word_col, size, mpi_word_type, MPI::ANY_TAG, 1, status);
Разве это не должно быть ниже?
MPI::COMM_WORLD.Recv(&word_col, sizeof(word_col), mpi_word_type, MPI::ANY_TAG, 1, status);
[str_size]
. Но это не работает так.