Добавление поддержки MPI в программу на C ++
-
22-08-2019 - |
Вопрос
У меня есть программа, которая была реализована на C ++, и теперь я хочу добавить поддержку MPI.Существует привязка MPI для C ++, с пространством имен MPI и всем остальным.
В моем случае у меня есть конкретный объект, который подходит для того, чтобы быть распараллеленным процессом в кластере.
Мои вопросы таковы:
- Кто-нибудь делал что-то подобное раньше?Могу ли я получить несколько советов о том, как лучше всего это реализовать?
- Как мне инициализировать MPI внутри конструктора?После инициализации MPI внутри конструктора класса все промежуточные вызовы также будут распараллелены?
Например:
MyClass obj;
x = x; //this will be parallelized ?
onj.calc();
y = x++; //this will be parallelized ?
z = obj.result();
Решение
Я бы действительно рекомендовал взять в руки Книга Gropp MPI, это действительно помогает для базового MPI!
Другие советы
MPI ничего не распараллеливает автоматически, он только предоставляет вам интерфейс для отправки данных между узлами.Ваш код пишется и выполняется как обычный последовательный код независимо на каждом узле, и время от времени вы отправляете данные на какой-то другой узел или пытаетесь получить данные с какого-то другого узла.
Подключившись к старой теме, я нашел OpenMPI и Повышение::MPI с ним приятно работать.Объектно-ориентированный дизайн библиотеки, возможно, немного затерт, но я обнаружил, что работать с ней гораздо приятнее, чем с чистым MPI, особенно с автоматической сериализацией многих типов и довольно расширяемым интерфейсом для сбора / сокращения функций, а также сериализации пользовательских типов.
В качестве справочной информации:
Большинство приложений , использующих MPI , написаны на Fortran или C.Каждая крупная реализация MPI написана на C.
Поддержка привязок MPI C ++ в лучшем случае носит отрывочный характер:Некоторые типы данных MPI недоступны (напримерMPI_DOUBLE), есть проблемы с вводом-выводом и порядком включения заголовков в исходные файлы.Существуют проблемы с искажением имен, если библиотека MPI была собрана на C, а приложение построено на Fortran или C ++.в mpich2 FAQ есть записи, которые помогут решить эти проблемы.Я менее знаком с Open MPI и его особым поведением с Fortran и C ++.
По вашим конкретным вопросам:
Я думаю, что у вас фундаментальное непонимание того, что такое MPI, а что нет, и как код приложения должен взаимодействовать с библиотеками MPI.
Параллельное программирование с MPI является отличным справочником для обучения программированию с помощью MPI.Примеры кода приведены на C, и большинство MPI API показаны в примере.Я настоятельно рекомендую вам ознакомиться с этой книгой, чтобы узнать, что такое параллельное программирование, а что нет.