MPI, как отправлять и получать неизвестные типы данных - PullRequest
1 голос
/ 19 октября 2011

Мы разработали библиотеку алгоритмов на C ++, которая позволяет пользователю реализовывать свои собственные типы данных для обмена данными между отдельными алгоритмами (также реализованными пользователем).Это прекрасно работает, но мы хотим обеспечить распараллеливание на уровне библиотеки.Отдельные алгоритмы должны выполняться параллельно на разных узлах машин с распределенной памятью.

Мы решили использовать MPI для распараллеливания, поскольку его можно использовать для машин с распределенной и общей памятью без изменений кода.К сожалению, сейчас мы боремся с проблемой, как распределить реализованные пользователем типы данных между узлами.У нас есть следующие проблемы:

  • Мы не знаем, насколько большими могут быть данные, они могут даже меняться от запуска к запуску.
  • Мы не знаем, какие данные находятся внутриструктура данных.
  • Объем данных может быть очень большим - до 1 ГБ (это не должно быть проблемой для MPI)
  • Пользователь не должен видеть никакой разницы в реализации типов данных или алгоритмов для параллельноговыполнение (для алгоритма на самом деле проблем нет)

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

1 Ответ

3 голосов
/ 19 октября 2011

Да, вы можете сделать это с помощью MPI, но нет, MPI не может сделать это самостоятельно для вас.

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

Вы можете упорядочить аргументы в простые старые данные (вручную или с такими вещами, как MPI_PACK), или вы можете создать тип данных MPI, который описывает расположение данных в памяти для этого конкретного экземпляра и будет копировать данные.Кроме того, вам нужно перенаправить любые указатели в структуре данных. Повысьте сериализацию может помочь вам во всем этом.

...