Расширенный комментарий, а не ответ:
Комментарий
@ 111111 о том, что если рабочая нагрузка не достаточно велика, то распараллеливание может фактически замедлить вычисления, это правильно. Так как вы публикуете только наброски своего кода, мы не можем однозначно диагностировать это как корень вашей проблемы, но это не является необоснованным выводом, к которому можно перейти.
Как правило, нельзя ожидать, что параллельная версия последовательной программы будет быстрее при любых обстоятельствах. Параллелизация сопряжена с издержками (иногда называемыми «параллельными издержками»). В вашем коде, например, операции широковещания и рассеяния вносят вклад в эти издержки, вы делаете их только в параллельном коде, если они отнимают много времени, они могут свести на нет (или еще хуже) преимущества более быстрых вычислений на нескольких процессорах.
Я собираюсь пойти дальше и предположить, что вы относительно плохо знакомы с параллельным программированием, и предположить, что этот вопрос, касающийся затрат и преимуществ распараллеливания, следует изучить в отношении вашего кода и ваших проблем. Вы должны определенно стремиться выработать хорошее понимание, подкрепленное данными, полученными в результате экспериментов, о том, как масштабируется производительность вашей программы (программ) при увеличении размера задания и при увеличении количества процессоров.
EDIT
Еще один незначительный момент: убедитесь, что вы используете правильные процедуры для синхронизации вашей программы. Я предлагаю вам использовать mph_wtime()
. Я видел, как наивные программисты используют вызовы типа utime
и в итоге складывают время, используемое всеми N процессорами; все, что вас должно заинтересовать - это время от начала до конца (или между 2 точками интереса).