C ++ программирование для кластеров и HPC - PullRequest
9 голосов
/ 31 марта 2010

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 31 марта 2010

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

Ваши лучшие ставки будут:

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

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

4 голосов
/ 01 апреля 2010

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

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

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

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

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

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

2 голосов
/ 31 марта 2010

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

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

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

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

2 голосов
/ 31 марта 2010

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

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

...