Медленное параллельное программирование - MPI, VB.NET и FORTRAN - PullRequest
1 голос
/ 27 апреля 2011

Я работаю над распараллеливанием программного обеспечения, которое имитирует процесс транспортировки и потока в зоне ненасыщенной почвы.Программное обеспечение состоит из пользовательского интерфейса VB.NET и ядра библиотеки FORTRAN DLL для выполнения расчетов.Я распараллелил программное обеспечение, используя пакет MPI.NET в части VB.NET.Когда программа запускается с несколькими процессами, все они, кроме главного процесса, переходят в функцию ожидания, в то время как главный процесс заботится о взаимодействии программного обеспечения с пользователем.Когда все данные, необходимые для моделирования, введены, главный процесс входит в библиотеку DLL FORTRAN и вызывает другие процессы.Они переходят к начальной точке функции в DLL, и вместе все процессы решают линейную систему уравнений примерно в 10-20 раз (исходное уравнение в частных производных является нелинейным, поэтому эти итерации позволяют повысить точность решения).Когда решение вычислено, все процессы возвращаются в VB.NET. Это делается для всех временных шагов моделирования.Когда все шаги вычислены, главный процесс продолжает взаимодействие с пользователем, в то время как другие процессы возвращаются в функцию ожидания, пока главный процесс не вызовет их снова.Дело в том, что эта программа работает намного медленнее, чем оригинальная, последовательная версия.Теперь может быть несколько причин для этого.Я использовал библиотеку PETSc в DLL-библиотеке FORTRAN для решения системы уравнений, и я думаю, что настроил ее достаточно хорошо.Мой вопрос заключается в том, что в какой-то момент в описанной мной архитектуре может быть одна или две точки, которые могут привести к значительному замедлению, если не будут правильно обработаны.Я не уверен, что последующие вызовы функции DLL могут стоить много времени.Моя система представляет собой процессор Intel Xeon 3470 с 8 ГБ ОЗУ.Системы, которые я пытался решить, имели до 120 000 неизвестных, которые, как я знаю, находятся на самой нижней границе того, что должно рассчитываться параллельно, но по крайней мере с матрицей в 120 000 я ожидал бы лучшую производительность, чем измерял.

Заранее спасибо за мысли, Мартин

Ответы [ 3 ]

1 голос
/ 27 апреля 2011

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

Возможно ли это решить с помощью решателя в памяти без распараллеливания с 8 ГБ ОЗУ?Это, безусловно, будет вашим ориентиром.Это то, с чем вы сравниваете свои параллельные результаты?

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

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

0 голосов
/ 27 апреля 2011

В моей системе установлен Xeon 3470, четырехъядерный процессор. Таким образом, все вычисления выполняются на этих машинах 4 на 1. Конечно, я не запускаю программу с более чем 4 процессами. Старый решатель, который имел программное обеспечение, был последовательным, и он все еще работает быстрее, чем параллельная версия. Когда я отображаю число процессов в зависимости от времени выполнения, я вижу, что время выполнения даже немного увеличивается с меньшими моделями, но этого следует ожидать из-за коммуникационных издержек.

Как в последовательном, так и в параллельном случае используются все 4 процессора, и баланс нагрузки между ними приемлем.

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

0 голосов
/ 27 апреля 2011

Если у вас несколько ядер, при последовательном запуске программы вы видите, что используется только один или несколько процессоров?Если нагрузка в последовательном случае высока и равномерно распределена по всем ядрам, тогда IMHO нет необходимости распараллеливать вашу программу.

...