Из того, что я понял из вашего вопроса, вы ищете механизм, обеспечивающий глобальное представление (только для чтения) проблемного пространства, но каждый процесс имеет право собственности (чтение-запись) на сегмент данных.
MPI - это просто спецификация API для межпроцессного взаимодействия для параллельных приложений, и любая его реализация будет работать на уровне ниже того, что вы ищете.
В приложениях HPC довольно часто выполняют декомпозицию данных способом, который вы упомянули, при этом MPI используется для синхронизации общих данных с другими процессами. Однако каждое приложение имеет разные схемы и требования к совместному использованию (некоторые могут пожелать обмениваться областями гало только с соседними узлами и, возможно, использовать неблокирующие вызовы для перекрытия связи при других вычислениях), чтобы повысить производительность, используя знания проблемной области.
Дело в том, что использовать MPI для синхронизации данных между процессами просто, но реализовать над ним слой для обработки синхронизации распределенных массивов общего назначения, который прост в использовании , но достаточно гибок, чтобы обрабатывать различные варианты использования. случаи могут быть довольно хитрыми.
Извиняюсь за то, что потратил так много времени, чтобы ответить на вопрос, но , чтобы ответить на ваш вопрос , AFAIK, не существует расширения для MPI или библиотеки, которая могла бы эффективно обрабатывать все варианты использования, оставаясь при этом более простой использовать, чем просто с помощью MPI. Однако можно работать выше уровня MPI, который поддерживает распределенные данные. Например:
- Используйте модель PGAS для работы с вашими данными. Затем вы можете использовать библиотеки, такие как Global Arrays (интерфейсы для C, C ++, Fortran, Python) или языки, поддерживающие PGAS, такие как UPC или Co-Array Fortran (скоро будет включен в стандарты Фортрана). Существуют также языки, разработанные специально для этой формы параллелизма, т.е. Крепость , Часовня , X10
- Бросай свои. Например, я работал над библиотекой, которая использует MPI для выполнения всей грязной работы, но скрывает сложность, предоставляя создание пользовательских типов данных для домена приложения и предоставляя такие API-интерфейсы, как:
X_Create(MODE, t_X)
: создать экземпляр массива, вызываемого всеми процессами, с указанием MODE
, указывающим, будет ли текущий процесс требовать доступа READ-WRITE или READ-ONLY
X_Sync_start(t_X)
: неблокирующий вызов для инициирования синхронизации в фоновом режиме.
X_Sync_complete(t_X)
: данные необходимы. Блокировка, если синхронизация не завершена.
- ... и другие вызовы для удаления данных, а также для выполнения специфических для домена задач, которые могут потребовать вызовов MPI.
Честно говоря, в большинстве случаев часто проще придерживаться базового MPI или OpenMP или, если таковой существует, с использованием параллельного решателя, написанного для предметной области приложения. Это, конечно, зависит от ваших требований.