Я работаю над расчетом на основе временного ряда. Каждая итерация расчета независима. Может ли кто-нибудь поделиться некоторыми советами / онлайн-учебниками по использованию параллельной обработки в Matlab? Как это можно указать внутри фактического кода?
Как использовать параллельную обработку в Matlab
Ответы:
Поскольку у вас есть доступ к набору инструментов Parallel, я предлагаю вам сначала проверить, можете ли вы сделать это простым способом.
В общем, вместо того, чтобы писать
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 предлагает собственный инструментарий для параллельных вычислений. Если вы не хотите покупать это, есть несколько вариантов
- Вы можете написать свой собственный mex-файл и использовать pthreads или OpenMP.
- Однако убедитесь, что вы не вызываете API Mex в параллельной части кода, потому что они не являются потокобезопасными.
- Если вам нужен более грубый параллелизм через MPI, вы можете попробовать pmatlab
- То же самое с parmatlab
Изменить: Добавление ссылки Параллельный MATLAB с файлами openmp mex
Я пробовал только первый.
Не забывайте, что многие функции Matlab уже являются многопоточными. При тщательном программировании вы можете воспользоваться ими - проверьте документацию для вашей версии, поскольку Mathworks, кажется, увеличивает диапазон и количество многопоточных функций с каждым новым выпуском. Например, кажется, что 2010a имеет многопоточные fft
, которые могут быть полезны для обработки временных рядов.
Если встроенная многопоточность вам не нужна, то, как предлагает @srean, доступен Parallel Computing Toolbox. За мои деньги (точнее, деньги моих работодателей) это путь, позволяющий вам программировать параллельно в Matlab, вместо того, чтобы прикручивать вещи. Я также должен признать, что я весьма впечатлен набором инструментов и возможностями, которые он предлагает.