Программирование на C++ для кластеров и HPC

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

Прежде, чем сделать это у меня есть простое любопытство: Если я понял принцип OpenMPI правильно, это - разработчик, который имеет задачу разделения заданий по другому вызову узлов, ОТПРАВЛЯЮТ и ПОЛУЧАЮТ на основе узла, доступного в то время.

Вы знаете, существует ли это действительно некоторая библиотека или ОС или независимо от того, что это имеет эту возможность, позволяющую моему коду reamain, как это теперь? В основном что-то, что подключает все компьютеры и позволяет доле как одной их памяти и ЦП?

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

9
задан Peter Mortensen 1 April 2010 в 10:38
поделиться

4 ответа

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

Лучше всего:

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

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

5
ответ дан 4 December 2019 в 15:13
поделиться

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

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

Возможно, у вас есть доступ к компьютеру с общей памятью:

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

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

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

4
ответ дан 4 December 2019 в 15:13
поделиться

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

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

2
ответ дан 4 December 2019 в 15:13
поделиться

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

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

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

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

2
ответ дан 4 December 2019 в 15:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: