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