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