Я занимаюсь программированием MPI, но я не знаю ни одного типичного способа передачи сложного состояния (как вы его описываете) между процессами. Вот как я думал о вашей проблеме, она, вероятно, соответствует вашему собственному мышлению ...
Я предполагаю, что ваши графы сложных объектов представлены в памяти блоками данных и указателями на другие блоки данных - обычная разновидность реализации графа. Как лучше всего переместить один из этих COG (чтобы обозначить аббревиатуру) из адресного пространства одного процесса в адресное пространство другого? Поскольку указатель является адресом памяти, указатель в одном адресном пространстве бесполезен в другом адресном пространстве, поэтому вам придется перевести его в некоторую нейтральную форму для транспорта (я думаю?).
Следовательно, чтобы отправить COG, его необходимо преобразовать в какую-либо форму, из которой принимающий процесс может построить в своем собственном адресном пространстве локальную версию графа с указателями, указывающими на адреса локальной памяти. Вы когда-нибудь записывали эти файлы в файл? Если это так, у вас уже есть форма, в которой он может быть транспортирован. Я не хочу предлагать это, но вы могли бы даже использовать файлы для связи между процессами - и это может быть проще в обработке, чем комбинация D и MPI. Ваш выбор!
Если у вас нет формы файла для COG, можете ли вы легко представить их в виде матриц или списков смежности? Другими словами, разработать свое собственное представительство для транспорта?
Я буду очень удивлен (но с удовольствием узнаю), сможете ли вы передать COG между процессами, не преобразовывая его из основанного на указателе, в более статичную структуру, такую как массивы или записи.
Редактировать, в ответ на редактирование ОП. MPI предоставляет простые способы передачи сложного состояния при условии, что сложное состояние представлено в виде значений, а не указателей. Вы можете передавать сложное состояние как во встроенном, так и в настраиваемом типе данных MPI; как показывает один из других ответов, они гибки и способны. Если наша программа не сохраняет сложное состояние в форме, которую могут обрабатывать пользовательские типы данных MPI, вам придется написать функции для упаковки / распаковки в удобное для сообщений представление. Если вы можете сделать это, то ваши сообщения будут выглядеть (для большинства целей) как вызовы функций.
Что касается проблем, связанных со сложным состоянием и зернистостью параллелизма, я не уверен, что полностью следую за вами. Мы (включаем себя в это широкое обобщение, если хотите или нет) обычно прибегаем к программированию MPI, потому что мы не можем получить достаточную производительность от одного процессора, мы знаем, что заплатим штраф в отношении вычислений, задержанных ожиданием что касается коммуникации, мы прилагаем все усилия, чтобы минимизировать это наказание, но, в конце концов, мы принимаем наказание в качестве стоимости распараллеливания. Конечно, некоторые задания слишком малы или слишком коротки, чтобы извлечь выгоду из распараллеливания, но многое из того, что мы (параллельные вычисления) делаем, слишком велико и слишком долго, чтобы избежать распараллеливания