Передача структур переменной длины между процессами MPI

Я должен MPI_Gatherv() много пар интервала/строки. Скажем, каждая пара похожа на это:

struct Pair {
  int x;
  unsigned s_len;
  char s[1]; // variable-length string of s_len chars
};

Как определить соответствующий тип данных MPI для Пары?

5
задан Constantin 15 February 2010 в 11:46
поделиться

3 ответа

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

Если вы должны отправить только одно сообщение, я бы отказался от определения типа данных для Pair: вместо этого я бы создал тип данных для всей полезной нагрузки и выгрузил все данные в один непрерывный нетипизированный пакет. Затем на принимающей стороне вы можете перебирать его, выделяя точное количество места, необходимое для каждой строки, и заполняя его. Позвольте мне для иллюстрации привести диаграмму ASCII. Это будет ваша полезная нагрузка:

| ..x1 .. | ..s_len1 .. | .... string1 .... | ..x2 .. | ..s_len2 .. | .string2. | .. x3 .. | ..s_len3 .. | ....... string3 ....... | ...

Вы отправляете все как одно целое (например, массив MPI_BYTE), затем получатель распаковал бы это примерно так:

while (buffer is not empty)
{
    read x;
    read s_len;
    allocate s_len characters;
    move s_len characters from buffer to allocated space;
}

Обратите внимание, однако, что это решение работает только в том случае, если представление данных целых чисел и символов одинаково в отправляющей и принимающей системах.

5
ответ дан 14 December 2019 в 01:07
поделиться

Я не думаю, что вы можете делать то, что хотите, с MPI. Я программист на Фортране, так что несите меня, если мое понимание C немного шатко. Кажется, вы хотите передать структуру данных, состоящую из 1 int и 1 строки (которую вы передаете, передавая местоположение первого символа в строке) от одного процесса к другому? Я думаю, что вам нужно будет передать строку фиксированной длины, которая, следовательно, должна быть такой же длины, как любая из строк, которые вы действительно хотите передать. Приемная зона для сбора этих струн должна быть достаточно большой, чтобы вмещать все струны вместе с их длиной.

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

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

3
ответ дан 14 December 2019 в 01:07
поделиться

Реализации MPI не проверяют и не интерпретируют фактическое содержимое сообщения. При условии, что вы знаете размер структуры данных, вы можете представить этот размер в некотором количестве символов char или int. Реализация MPI не будет знать или заботиться о фактических внутренних деталях данных.

Есть несколько оговорок... отправитель и получатель должны договориться об интерпретации содержимого сообщения, а буфер, который вы предоставляете на стороне отправителя и получателя, должен помещаться в некоторое определенное количество char'ов или int'ов.

1
ответ дан 14 December 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: