2010-10-30 5 views
8

Я работаю над вычислением временных рядов. Каждая итерация вычисления независима. Может ли кто-нибудь поделиться некоторыми советами/онлайн-праймерами по использованию параллельной обработки в Matlab? Как это можно указать внутри фактического кода?Как использовать параллельную обработку в Matlab

ответ

12

Поскольку у вас есть доступ к панели инструментов Parallel, я предлагаю вам сначала проверить, можете ли вы сделать это простым способом.

В принципе, вместо того, чтобы писать

for i=1:lots 
    out(:,i)=do(something); 
end 

Пишешь

parfor i=1:lots 
    out(:,i)=do(something); 
end 

Затем вы используете matlabpool создать несколько рабочих (вы можете иметь максимум 8 на локальном компьютере с панели инструментов и т. д. на удаленном кластере, если у вас также есть лицензия Distributed Computing Server), и вы запускаете код, и видите хорошие выигрыши в скорости, когда ваши итерации выполняются на 8 ядер вместо одного.

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

Обратите внимание, что особенно если вы запустите код на локальном компьютере, вы можете столкнуться с проблемами памяти (которые могут проявляться в очень медленном выполнении в параллельном режиме, поскольку вы выполняете пейджинг): каждый рабочий получает копию рабочей области, поэтому, если ваш расчет предполагает создание массива 500 МБ, 8 сотрудникам потребуется всего 4 ГБ ОЗУ - и тогда вы даже не начали подсчитывать ОЗУ родительского процесса! Кроме того, может быть полезно использовать только N-1 ядра на вашем компьютере, так что осталось еще одно ядро ​​для других процессов, которые могут запускаться на компьютере (например, обязательный антивирус ...).

+0

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

+1

@Joel B: Вы хотите распараллеливать цикл, который выполняет много итераций, поскольку запуск цикла, который делает, скажем, 500 итераций в 1024-ядерном кластере, является довольно пустой тратой. Конечно, ядро ​​параллельного цикла должно занимать больше времени, чем накладные расходы на потоки. Однако это почти всегда верно в Matlab, поскольку вам требуется намного меньше циклов, и, следовательно, расчет внутри даже самого внутреннего цикла довольно тяжелый. – Jonas

+1

Но как насчет только четырехъядерного одиночного ПК? Наверное, сделать внешний цикл имеет смысл? Было бы справедливо сказать, что параллелизм внутреннего цикла лучше, если у меня есть огромный компьютерный кластер в моем распоряжении, но внешний цикл лучше распараллеливать, если у меня есть только один многоядерный ПК? –

5

Mathworks предлагает свои собственные parallel computing toolbox. Если вы не хотите его приобретать, существует несколько вариантов:

  • Вы можете написать свой собственный файл mex и использовать pthreads или OpenMP.
  • Однако убедитесь, что вы не вызываете любой Mex апи в параллельной части кода, потому что они Арент Потокобезопасная
  • Если вы хотите крупнозернистым параллелизм с помощью MPI вы можете попробовать pmatlab
  • То же самое с parmatlab

Edit: Добавление ссылка Parallel MATLAB with openmp mex files

Я только попробовал первый.

+1

Вам также может быть интересно узнать, что Parallel Computing Toolbox недавно (R2010b) представил графические процессоры на базе CUDA (требуется карта nvidia, поддерживающая возможность вычисления 1.3): http://www.mathworks.com/discovery/matlab-gpu .html – Amro

2

Не забывайте, что многие функции Matlab уже многопоточны. При тщательном программировании вы сможете воспользоваться ими - проверьте документацию для своей версии, так как Mathworks, похоже, увеличивает количество и количество многопоточных функций с каждой новой версией. Например, кажется, что 2010a имеет многопоточность fft s, что может быть полезно для обработки временных рядов.

Если внутренняя многопоточность не то, что вам нужно, то, как предлагает @srean, имеется Parallel Computing Toolbox. Для моих денег (или, точнее, денег моих работодателей) это путь, позволяющий вам параллельно программировать в Matlab, вместо того чтобы болтать. Я тоже должен признать, что я очень впечатлен набором инструментов и предлагаемыми возможностями.

+0

У меня есть доступ к Paral Computing Toolbox Matlab. Можете ли вы поделиться с ними хорошими праймерами/примерами? – Eduardas

+2

@Edward: Я присутствовал на двухдневном учебном курсе Mathworks на PCT, прочитал документацию и отработал ее для себя. Но у меня есть опыт параллельного программирования с Fortran и MPI и OpenMP. Matlab Central все больше уделяет внимание параллельным вычислениям с помощью Matlab, и это может быть местом для начала. –

Смежные вопросы