Отправить структуру с символом [] в MPI

0

Я пытаюсь отправить некоторые данные от работников в мастер (рейтинг 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);
}

Я боролся с этим часами, и я видел много примеров и другие вопросы об этом, но я не мог понять, в чем проблема.

Теги:
struct
mpi
char

1 ответ

0

Это ошибочное программирование. У вас есть нераспределенный и неинициализированный указатель, и вы пытаетесь подталкивать данные к этому. У вас есть два варианта: либо вы определяете свою структуру как:

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);
  • 0
    В моей предыдущей структуре в вопросе была ошибка. Я пробовал кое-что, и в этом причина. Я исправил это, чтобы иметь [str_size] . Но это не работает так.
  • 0
    @ gd.silva, так что одна часть, которую вы уже исправили, проверьте, передаете ли вы правильный размер при получении, проверьте мои отредактированные ответы
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню