После отсчета времени это фактически в 100 раз медленнее, чем при использовании обычного цикла !!! Я знаю, что parfor может делать параллельные суммы, поэтому я не уверен, почему это не работает.
я бегу
matlabpool
с готовыми конфигурациями перед запуском моего кода.
Я относительно новичок в Matlab и только начал использовать параллельные функции, поэтому, пожалуйста, не думайте, что я не делаю что-то глупое.
Спасибо!
PS: Я запускаю код на четырехъядерном процессоре, поэтому ожидаю увидеть некоторые улучшения.
не могли бы вы сообщить нам значения numdims, numcases и фактические значения времени, которые вы нашли? Благодарю. rwong 04.07.2010
Выполнение разделения и группировки результатов (накладные расходы на разделение работы и сбор результатов из нескольких потоков / ядер) высоки для малых значений nt. Это нормально, вы не будете разделять данные для простых задач, которые можно быстро выполнить в простом цикле.
Потоки поступают из пула потоков, поэтому накладных расходов на создание потоков не должно быть. Но для создания частичных результатов n матрицы из размера bistar должны быть созданы, все частичные результаты вычислены, а затем все эти частичные результаты должны быть добавлены (рекомбинирование). В прямом цикле это с высокой вероятностью выполняется на месте, выделения не выполняются.
Полный текст справки (спасибо за ссылку ниже):
Если время для вычисления f, g и h велико, parfor будет значительно быстрее, чем соответствующий оператор for, даже если n относительно мало.
Итак, вы видите, что они означают в точности то же, что я имею в виду, накладные расходы для малых значений n окупаются только в том случае, если то, что вы делаете в цикле, является сложным / отнимающим достаточно времени.
Ответ 2 · рейтинг 13 · Jonas
Parfor связан с небольшими накладными расходами. Таким образом, если nt действительно мало и если вычисления в цикле выполняются очень быстро (например, сложение), решение parfor работает медленнее. Более того, если вы запустите parfor на четырехъядерном процессоре, прирост скорости будет близок к линейному для 1-3 ядер, но меньше, если вы используете 4 ядра, поскольку последнее ядро также должно запускать системные процессы.
Например, если parfor имеет 100 мс накладных расходов, а вычисление в цикле занимает 5 мс, и если мы предположим, что прирост скорости является линейным до 4 ядер с коэффициентом 1 (т.е. использование 4 ядер ускоряет вычисления в 4 раза) , nt должно быть около 30, чтобы вы достигли увеличения скорости с parfor (150 мс с for, 132 мс с parfor). Если бы вы выполняли только 10 итераций, parfor было бы медленнее (50 мс с for, 112 мс с parfor).
Вы можете рассчитать накладные расходы на своей машине, сравнив время выполнения с 1 рабочим против 0 рабочих, и вы можете оценить прирост скорости, подгоняя лайнер во время выполнения от 1 до 4 рабочих. Тогда вы узнаете, когда будет полезно использовать parfor.
Ответ 3 · рейтинг 3 · Daniel
Помимо плохой производительности из-за накладных расходов на связь (см. Другие ответы), есть еще одна причина не использовать parfor в этом случае. Все, что делается в parfor в этом случае, использует встроенную многопоточность. Предполагая, что все рабочие работают на одном ПК, нет никакого преимущества, потому что один вызов уже использует все ядра вашего процессора.