Как использовать параллельную обработку в Matlab - PullRequest
9 голосов
/ 30 октября 2010

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

Ответы [ 3 ]

12 голосов
/ 30 октября 2010

Поскольку у вас есть доступ к панели инструментов 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, так что остается еще одно ядро ​​для других процессов, которые могут запускаться на компьютере (например, обязательный антивирус ...).

5 голосов
/ 30 октября 2010

Mathworks предлагает собственную панель параллельных вычислений .Если вы не хотите его приобретать, есть несколько вариантов

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

Редактировать: Добавление ссылки Параллельный MATLAB с файлами openmp mex

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

2 голосов
/ 30 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...