Передача структур переменной длины между процессами MPI - PullRequest
5 голосов
/ 13 февраля 2010

Мне нужно MPI_Gatherv() количество пар int / string. Допустим, каждая пара выглядит так:

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

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

Ответы [ 3 ]

4 голосов
/ 16 февраля 2010

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

Если вы должны отправить только одно сообщение, то я бы отказался от определения типа данных для пары: вместо этого я создал бы тип данных для всей полезной нагрузки и выгрузил бы все данные в один непрерывный нетипизированный пакет. Затем на принимающей стороне вы можете выполнить итерацию, выделив точное количество места, необходимое для каждой строки, и заполнив ее. Позвольте мне привести диаграмму 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;
}

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

2 голосов
/ 15 февраля 2010

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

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

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

1 голос
/ 19 февраля 2010

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

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

...