LINUX.ORG.RU

распределение нагрузки на процессор


0

0

День добрый. Встал очень серьезный вопрос:

Есть программа, осуществляет просчет данных(подбор нужных коэффициентов для спец. формул). Для просчета 2 оптимальных коэффициентов требуется более 10 часов работы на 12 компьютерах по 2Ghz,2Gb ОЗУ. Одно исполнение программы порядка 5 минут.

Как на аппаратном уровне ускорить исполнение программы? Input-Output занимает не более 10% рабочего времени.

Была идея реализации кластера компьютеров. Идея отпала ввиду нереалистичности заставить программистов писать код "специальным образом".

Есть ли какие-нибудь способы распределения нагрузки по сети машин? Каким образом можно сократить время исполнения программы не беря в расчет "переписания ее кода с нуля".


>Есть ли какие-нибудь способы распределения нагрузки по сети машин?
OpenMP + OpenMPI, а еще бы выкинуть текущих ленивых программистов, которые не хотят "писать код "специальным образом".

anotheranonymous
()

> более 10 часов работы на 12 компьютерах по 2Ghz,2Gb ОЗУ

Значит загрузка уже как-то распределена?

Наиболее сильного ускорения можно добиться при использовании MPI, можно будет нарастить количество компов, и если все сделано правильно... =)

Еще есть вариант - использовать OpenMP, это проще, но это для использования внутри одной машины (раскидать задачу по ядрам), а значит сильнее ограничивает максимальное ускорение.

Еще стоит отпрофилировать код(найти самые долгие куски кода) и возможно поменять железо(если большая нагрузка на шину памяти то имеет смысл переезжать на i7/xeon 55).

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

Изначальный язык написания программы: C. Никто и не задумывался о параллельности изначально. Мы столкнулись с тем, что нужно исполнить программу быстрее.
Насчет 12 машин: "параллельности" и нет, просто н каждой машине запускалась одна и таже программа только с разными параметрами. На каждом компе собирались результаты и обрабатывались уже отдельным ПО.

Сейчас не знаю куда и двигаться. Необходимо увеличить скорость исполнения программы. Еще раз повторюсь, перейти на другой язык программирования, встраивать директивы(а если я правильно понял, что MP, MPI, PVM и прочее предлагают пересматривать код) - не реально для нас. Программисты должны писать на чистом C, max - C++.

sglex
() автор топика
Ответ на: комментарий от sglex

> Одно исполнение программы порядка 5 минут.

А это что? У вас много мелких запусков одной программы? Если так - можно подумать о batch system. http://en.wikipedia.org/wiki/Portable_Batch_System

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

> Необходимо увеличить скорость исполнения программы. Еще раз повторюсь, перейти на другой язык программирования, встраивать директивы(а если я правильно понял, что MP, MPI, PVM и прочее предлагают пересматривать код) - не реально для нас. Программисты должны писать на чистом C, max - C++.

Ну что-то то делать нужно, другой вопрос в том что и за какое время. Из этих вариантов наименее изменяет код OpenMP(вставил пару строк перед for-ом - у тебя параллельный for), но для него требуется поддержка со стороны компиллера(gcc-4.2+).

YesSSS ★★★
()

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

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

Legioner ★★★★★
()

> Есть ли какие-нибудь способы распределения нагрузки по сети машин?

в общем случае нет. Из кучи серваков не сделать "один большой виртуальный".

true_admin ★★★★★
()

Измените алгоритм поиска оптимума. Вообще не очень понятно --- у вас там:

а) задача подобрать кучу параметров что бы два целевых загнать в оптимум, или

б) только два входных параметра изменяя которые надо загнать задачу в оптимум?

Если первое, попробуйте генетический алгоритм для поиска начальных точек для традиционных методов спуска. Может так быстрее окажется.

psv1967 ★★★★★
()
Ответ на: комментарий от sglex

А какой метод мат.программирования используете?

dave ★★★★★
()
Ответ на: комментарий от sglex

Ну тогда решение сейчас находится на сетке 37Х37, если гладкое все, то градиентный метод будет быстрее.

Задаете точку и ее окрестности --- считаете градиент. Точки (уже посчитанные) между которыми идет градиент дополняете еще одной строго по ходу градиента. В общем самый экономный метод, на каждом шаге считается только одна дополнительная точка. Остальные машины находят оптимум для остальных наборов данных.

Если все не гладкое, то уменьшить число точек сильно не удастся.

psv1967 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.