Вы на правильном пути.Но, насколько мне известно, вы не можете использовать анонимные функции в parfor (если я ошибаюсь или это было верно только в более ранней версии моих извинений).Также вам нужна строка, в которой вы открываете свой пул Matlab и информируете рабочие узлы о том, что вы собираетесь использовать в параллельном разделе.Вот как я бы начал с этой проблемы:
fileDep = {'Compute2BodyForce',...
'Compute3BodyForce',...
'ComputeOtherForce'};
num_procs = 3;
matlabpool('open','Mycluster',num_procs,'FileDependencies',fileDep);
parfor iter = 1:3
% iter is passed to the functions so the functions can return NaNs when we don't want computation done
body_2_dummy{iter} = Compute2BodyForce(data,iter); %assuming data is a variable here, maybe a struct that gets parsed inside the functions
body_3_dummy{iter} = Compute3BodyForce(data,iter);
other_dummy{iter} = ComputeOtherForce(data,iter);
end
% resolve and sum up here
total_force = body_2_dummy{1} + body_3_dummy{2} + other_dummy{3};
Обратите внимание, что кроме body_2_dummy {1}, body_3_dummy {2} и other_dummy {3} значения этих функций должны возвращать NaN.Это обходит разочаровывающую вещь в Matlab.Типичный способ кодирования этого кода в большинстве языков выглядит примерно так:
parfor iter = 1:3
if iter == 1
body_2_dummy = Compute2Body(data);
end
% more ifs for the other forces
end
Здесь мы несем ответственность за то, чтобы body_2_dummy имел однозначное значение.Но в Matlab эта ответственность ложится на интерпретатора, и он не позволяет этого, потому что он считает body_2_dummy зависящим от порядка выполнения.
Я надеюсь, что это приведет вас на правильный путь.Не стесняйтесь возвращаться с любыми дополнительными вопросами.
Кроме того, в качестве общего совета, как правило, значительно проще оптимизировать функцию и попытаться снизить ее стоимость, чем распараллеливать функции.Вы провели время с функциями силы в профилировщике Matlab?
- Андрей
Последующие правки:
Анонимные функции - это когда вы делаете что-то вроде этого:
spam = @(x) x + 2;
spam(2)
ans = 4
Здесь спам является анонимной функцией.Вы можете передать функцию другой функции, передав ей дескриптор функции, который является @ spam.
Мой опыт работы с инструментами параллельных вычислений преимущественно связан со Sbiotoolbox.В этом наборе инструментов биологические модели являются объектами и могут передаваться по ссылке на дескриптор способом, который основан на более старой версии графики дескриптора Matlab.Проблема, однако, в том, что дескриптор отсоединяется от модели, и возникает ряд довольно запутанных ошибок.По этой причине я избегаю всякой ссылки на дескриптор при использовании параллельной функциональности Matlab.
Однако я должен признать, что я не проверял, можно ли использовать анонимные функции, поскольку есть некоторые дополнительные подробности о локальных и удаленных работниках Matlabдать строгий ответ.В настоящее время у меня нет легкого доступа к удаленному кластеру Matlab, поэтому его нужно добавить в список проектов.
Профилировщик Matlab - это инструмент, который поставляется с Matlab.Он позволяет вам вставить функцию и измерить время, затрачиваемое на каждую строку кода, чтобы вы могли выделить, где вам нужно перестроить код, чтобы он был быстрее.Это особенно хорошо при поиске ошибок, таких как изменение размеров массивов в циклах, которые снижают производительность Matlab.
Я бы посоветовал вам искать «profiler» в справке Matlab.Документация довольно хорошая и гораздо более полная, чем все, что я мог бы здесь разместить.
Удачи.