MPI использует больше процессоров, стоит больше времени - PullRequest
1 голос
/ 20 марта 2012

Моя параллельная программа реализована с использованием c ++ и OpenMPI.Когда я тестировал его, я обнаружил, что если я использую больше процессоров, это стоит больше времени.Как это могло произойти?

Структура моего кода следующая:

BEGIN

MPI::Init

if (rank == 0)
{ Read files } 

MPI::Bcast
MPI::Scatter

for (i=0; i<N;i++)
{  
   do something here
   MPI::Gather
   if(rank ==0)
   { save result}
}

MPI::Finallize()

END

Я запутался в этом.

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

Расширенный комментарий, а не ответ:

Комментарий

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

Как правило, нельзя ожидать, что параллельная версия последовательной программы будет быстрее при любых обстоятельствах. Параллелизация сопряжена с издержками (иногда называемыми «параллельными издержками»). В вашем коде, например, операции широковещания и рассеяния вносят вклад в эти издержки, вы делаете их только в параллельном коде, если они отнимают много времени, они могут свести на нет (или еще хуже) преимущества более быстрых вычислений на нескольких процессорах.

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

EDIT

Еще один незначительный момент: убедитесь, что вы используете правильные процедуры для синхронизации вашей программы. Я предлагаю вам использовать mph_wtime(). Я видел, как наивные программисты используют вызовы типа utime и в итоге складывают время, используемое всеми N процессорами; все, что вас должно заинтересовать - это время от начала до конца (или между 2 точками интереса).

1 голос
/ 21 марта 2012

Для вашей программы множество кода, который выполняется параллельно, объявляет производительность http://en.wikipedia.org/wiki/Amdahl's_law. И многие другие параметры влияют на производительность, например, на архитектуру вашего компьютера, например, если вы используете систему с общей памятью, ваша память важна, в вашейКод, если файлы большого размера, может снизить производительность, и в этом случае вы должны использовать производные типы данных для связи, скорость сети важна для распределенных систем, ....

1 голос
/ 20 марта 2012

Трудно узнать без дополнительной информации об окружающей среде и фактическом коде, который выполняется, но учтите, что MPI::Gather() и MPI::Bcast() блокируют вызовы. Процесс должен ждать, пока все процессы достигнут этой точки.

Если один ЦП работает очень медленно - ожидание его достижения Bcast() замедлит общее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...