2010-03-30 2 views
9

Мне нужно написать научное приложение на C++, выполняя множество вычислений и используя много памяти. У меня есть часть работы, но из-за высоких требований с точки зрения ресурсов, я думал начать переходить на OpenMPI.Программирование на C++ для кластеров и HPC

Прежде чем это сделать, у меня есть простое любопытство: если я правильно понял принцип OpenMPI, разработчик имеет задачу разделения заданий на разные узлы, вызывающие SEND и RECEIVE на основе узла, доступного в то время.

Знаете ли вы, существует ли какая-либо библиотека или ОС или что-то еще, что имеет такую ​​возможность, позволяя моему коду воспроизводиться так, как сейчас? В основном что-то, что соединяет все компьютеры и позволяет делиться ими как памятью и процессором?

Я немного смущен из-за огромного объема материала, доступного по этой теме. Должен ли я смотреть на облачные вычисления? или распределенной общей памяти?

ответ

5

В настоящее время нет библиотеки или утилиты C++, которая позволит вам автоматически распараллелить свой код на кластере машин. Конечно, существует множество способов достижения распределенных вычислений с другими подходами, вы действительно хотите оптимизировать свое приложение для использования передачи сообщений или распределенной общей памяти.

Ваши лучшие ставки будут заключаться в следующем:

  1. Преобразование реализации в решение задач на основе. Есть много способов сделать это, но это, безусловно, будет сделано вручную.
  2. Четко определите, где вы можете разбить задачи и как эти задачи по существу взаимодействуют друг с другом.
  3. Используйте библиотеку более высокого уровня, которая основывается на OpenMPI/Mpich - Boost.MPI.

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

+0

HI! Большое спасибо за ваш ответ. –

2

Если передача сообщений удерживает вас, попробуйте распределенные объекты. Существует множество распределенных объектов. CORBA, DCOM, ICE, чтобы назвать несколько ... Если вы решите распространять свои объекты, ваши объекты будут иметь глобальную видимость через интерфейсы (как данные, так и методы), которые вы определите. Любой объект в любом узле может получить доступ к этим распределенным объектам.

Я искал программное обеспечение, которое позволяет распространять память, но не встречается. Я думаю, это потому, что у вас есть все эти распределенные объектные рамки, и людям не нужно распространять память как таковую.

+0

Отлично! Я много слышал об этих технологиях, которые использовал мой старый друг. Я спрошу и начну смотреть! –

2

У меня был хороший опыт использования Top-C в аспирантуре.

С домашней страницы: «TOP-C специально отличает себя как пакет, который легко распараллеливает существующие последовательные приложения».

http://www.ccs.neu.edu/home/gene/topc.html

Edit: Я хотел бы добавить, что это гораздо проще распараллелить программу, если она использует «тривиальный параллелизм». например Узлы не нужно необходимо обмениваться памятью. Mapreduce построен на этой концепции.Если вы можете свести к минимуму количество общего состояния, которое используют ваши узлы, вы увидите на порядок больше улучшений от параллельной обработки.

+0

HI! Большое спасибо за ваш ответ. Я не знал об этом проекте! У меня будет рывок! –

4

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

Кроме того, лучший последовательный алгоритм не всегда может быть наиболее эффективным алгоритмом, как только он был распараллелен. Иногда лучшим вариантом является простой, но последовательно-оптимальный алгоритм.

Вы можете иметь доступ к компьютеру с разделяемой памятью:

  • все многоядерные процессоры эффективно компьютеры с разделяемой памятью;
  • На множестве кластеров узлы часто имеют два или четыре процессора, если каждый из них имеет 4 ядра, тогда у вас может быть 16-ядерная машина с общей памятью в вашем кластере;
  • Если у вас есть доступ к суперкомпьютеру MPP, вы, вероятно, обнаружите, что каждый его узел является компьютером с общей памятью.

Если вы застряли с передачей сообщений, то я настоятельно советую вам придерживаться C++ и OpenMPI (или любой другой MPI уже установлен в вашей системе), и вы обязательно должны смотреть на BoostMPI тоже. Я настоятельно рекомендую это, потому что, как только вы выходите за пределы основного потока высокопроизводительных научных вычислений, вы можете оказаться в армии одного программирования с уникальной коллекцией библиотек для фитнеса для исследований и других инструментов. C++, OpenMPI и Boost достаточно хорошо используются, чтобы вы могли считать их «оружейными» или любыми вашими предпочтительными аналогами. На SO достаточно мало трафика, например, на MPI и OpenMP, проверяйте статистику по другим технологиям, прежде чем ставить на них ферму.

Если у вас нет опыта работы с MPI, вы можете посмотреть книгу под названием Parallel Scientific Computing в C++ и MPI от Karniadakis и Kirby. Использование MPI от Gropp и др. в порядке, но это не текст новичка по программированию для передачи сообщений.

Смежные вопросы