Если ваши вычисления так же неловко параллельны, как вы указываете, вы должны ожидать хорошего ускорения, распространяя нагрузку на все 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 равных частей и одновременно обслуживать их по очереди на машину для исполнения. В этом случае то, что вы получаете при балансировке нагрузки, может быть подвержено риску потерять затраты времени на управление работой. Вы платите свои деньги, и вы выбираете свой выбор.
Из вашего заявления о проблеме я бы не стал принимать решение о том, какое решение будет идти на основе ожидаемой производительности, потому что я ожидал бы, что любой из подходов окажется в одном и том же рабочем месте, но на время разработки рабочего решения.
Дополнительная информация, необходимая для любого хорошего ответа: какая связь необходима между процессами или потоками, выполняющими отдельные вычисления? С OpenMP эти сообщения обычно замаскированы под доступ к общей памяти. Другими словами, насколько близки * смущающие параллели * - это ваши вычисления? Наконец, у вас есть система управления заданиями, такая как Grid Engine, установленная на вашем оборудовании? –
Мне нужно связаться с нашим администратором sys, чтобы узнать о любом Grid Engine, но до сих пор я никогда не слышал о таком движке в нашем вычислительном кластере. –
Мне нужно связаться с нашим администратором sys, чтобы узнать о любом Grid Engine, но до сих пор я никогда не слышал о таком движке в нашем вычислительном кластере. Итак, на какое-то время давайте рассмотрим, что нет никакого механизма сетки. Моя программа очень неловко параллельна (!). Предположим, вам нужно , чтобы применить некоторую функцию к каждой ячейке огромного массива в любом порядке ячеек. (т. е. для заданной матрицы (массива) аргументов (углов), вычислить матрицу Cos каждого аргумента (угол)). Но вычислительное время «Cos» и размер матрицы очень большие. –