Как использовать параллельную обработку в Matlab
Я работаю над расчетом на основе временных рядов. Каждая итерация вычисления независима. Может ли кто-нибудь поделиться некоторыми советами / онлайн-праймерами по использованию параллельной обработки в Matlab? Как это можно указать внутри фактического кода?
3 ответов
поскольку у вас есть доступ к Parallel toolbox, я предлагаю вам сначала проверить, можете ли вы сделать это простым способом.
в основном, вместо того, чтобы писать
for i=1:lots
out(:,i)=do(something);
end
вы пишите
parfor i=1:lots
out(:,i)=do(something);
end
затем, вы используете matlabpool
для создания нескольких работников (вы можете иметь максимум 8 на вашем локальном компьютере с набором инструментов и тонны на удаленном кластере, если у вас также есть лицензия распределенного вычислительного сервера), и вы запускаете код и видите хороший прирост скорости, когда ваши итерации выполняются 8 ядрами вместо одного.
хотя parfor
маршрут самый простой, он может не работать прямо из коробки, так как вы можете сделать индексацию неправильно, или вы можете ссылаться на массив проблемным способом и т. д. Посмотрите на предупреждения mlint в Редакторе, прочитайте документацию и полагайтесь на старые добрые проб и ошибок, и вы должны выяснить это достаточно быстро. Если у вас есть вложенные циклы, часто лучше всего распараллелить только самый внутренний и обеспечить его делает тонны итераций-это не только хороший дизайн, но и уменьшает количество кода, который может дать вам проблемы.
обратите внимание, что особенно если вы запускаете код на локальном компьютере, вы можете столкнуться с проблемами памяти (которые могут проявляться в очень медленном выполнении в параллельном режиме, потому что вы подкачки): каждый работник получает копию рабочей области, поэтому, если ваш расчет включает в себя создание массива 500 МБ, 8 рабочих потребуется всего 4 ГБ ОЗУ - и тогда вы даже не начали подсчет ОЗУ родительского процесса! Кроме того, может быть полезно использовать только N-1 ядра на вашем компьютере, так что есть еще одно ядро для других процессов, которые могут работать на компьютере (например, обязательный антивирус...).
Mathworks предлагает свои собственные Parallel computing toolbox. Если вы не хотите покупать, что, есть несколько вариантов
- вы можете написать свой собственный файл mex и использовать pthreads или OpenMP.
- однако убедитесь, что вы не вызываете api Mex в параллельной части кода, потому что они не являются потокобезопасными
- если вы хотите более грубый зернистый параллелизм через MPI, вы можете попробовать pmatlab
- же с parmatlab
Edit: добавление ссылки параллельный MATLAB с файлами openmp mex
Я только попробовал первый.
Не забывайте, что многие функции Matlab уже многопоточны. При тщательном программировании вы можете воспользоваться ими - проверьте документацию для своей версии, поскольку Mathworks, похоже, увеличивает диапазон и количество многопоточных функций с каждым новым выпуском. Например, кажется, что 2010a имеет многопоточность fft
s, которые могут быть полезны для обработки временных рядов.
Если внутренняя многопоточность не то, что вам нужно, то как @srean предполагает, что набор инструментов параллельных вычислений доступен. Для моих денег (или, скорее, денег моих работодателей) это путь, позволяющий вам программировать параллельно в Matlab, а не болты. Я также должен признать, что я впечатлен набором инструментов и возможностями, которые он предлагает.