2013-02-28 3 views
2

Я решаю численно некоторые обычные дифференциальные уравнения.Гибрид: OpenMPI + OpenMP на кластере

У меня очень простые (концептуально), но очень длинные вычисления. Существует очень длинный массив (~ 2M ячеек), и для каждой ячейки мне нужно выполнить численное интегрирование. Эту процедуру следует повторять 1000 раз. Используя OpenMP-параллелизм и одну 24-ядерную машину, для этого требуется около недели (что неприемлемо).

У меня есть кластер из 20 таких (24-ядерных) машин и думаю о гибридной реализации. Я хочу использовать MPI для передачи этих 20 узлов, и на каждом узле используется регулярный параллельный параллельный OpenMP.

В принципе, мне нужно разделить мой очень длинный массив на 20 (узлы) рабочих блоков X24 (proccs).

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

Может быть, я должен создать «пул рабочих» и «накормить» их своим массивом или чем-то еще.

Любые предложения и полезные ссылки приветствуются!

+0

Дополнительная информация, необходимая для любого хорошего ответа: какая связь необходима между процессами или потоками, выполняющими отдельные вычисления? С OpenMP эти сообщения обычно замаскированы под доступ к общей памяти. Другими словами, насколько близки * смущающие параллели * - это ваши вычисления? Наконец, у вас есть система управления заданиями, такая как Grid Engine, установленная на вашем оборудовании? –

+0

Мне нужно связаться с нашим администратором sys, чтобы узнать о любом Grid Engine, но до сих пор я никогда не слышал о таком движке в нашем вычислительном кластере. –

+0

Мне нужно связаться с нашим администратором sys, чтобы узнать о любом Grid Engine, но до сих пор я никогда не слышал о таком движке в нашем вычислительном кластере. Итак, на какое-то время давайте рассмотрим, что нет никакого механизма сетки. Моя программа очень неловко параллельна (!). Предположим, вам нужно , чтобы применить некоторую функцию к каждой ячейке огромного массива в любом порядке ячеек. (т. е. для заданной матрицы (массива) аргументов (углов), вычислить матрицу Cos каждого аргумента (угол)). Но вычислительное время «Cos» и размер матрицы очень большие. –

ответ

0

Если ваши вычисления так же неловко параллельны, как вы указываете, вы должны ожидать хорошего ускорения, распространяя нагрузку на все 20 ваших машин. К good Я имею в виду close to 20 и по close to 20 Я имею в виду любое число, которое вы на самом деле получаете, что оставляет вам думать, что усилия были полезными.

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

Один из альтернатив гибридной программе MPI + OpenMP - это сценарий задания (написанный на вашем любимом языке сценариев), который просто разбивает ваш большой массив на 20 частей и запускает 20 заданий, по одному на каждой машине, на которой запущен экземпляр вашей программы , Когда у них все закончится, есть еще один скрипт, готовый рекомбинировать результаты. Это позволит избежать необходимости писать любой код MPI.

Если на вашем компьютере установлена ​​программа Grid Engine, вы можете написать сценарий отправки задания, чтобы отправить свою работу в качестве задания array и позволить Grid Engine позаботиться о том, чтобы обработать работу с отдельными машинами/задачами. Я ожидаю, что другие системы управления заданиями имеют аналогичные возможности, но я не знаком с ними.

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

Использование MPI на компьютере с общей памятью иногда является лучшим (в плане производительности) подходом, чем OpenMP, иногда хуже. Проблема в том, что трудно быть уверенным в том, какой подход лучше подходит для конкретной программы на конкретной архитектуре с ОЗУ и кешем, а также между соединениями и шинами и всеми другими переменными.

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

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

+0

Отличный ответ !!! Я был уверен, что для общей памяти лучше использовать OpenMP, чем MPI, но теперь я думаю просто переписать мою программу, как вы предлагали только с точки зрения MPI, и позволить программе получать доступ ко всем доступным процессорам всего кластера (20X24). Что касается размера моего массива, он является гибким, так как это сетка, и я могу настроить его размер на размер вычислительных блоков, чтобы получить максимальную нагрузку. –