Параллельное программирование на MATLAB для одновременного выполнения 3-х различных функций - PullRequest
3 голосов
/ 06 июня 2011

Я пишу код молекулярной динамики, который требует вычисления трех различных типов сил, используя 3 функции, а именно: Compute2BodyForce, Compute3BodyForce и ComputeOtherForce.Так как функции независимы друг от друга, и я хочу рассчитать каждую функцию отдельно для 3 разных ядер, правильный способ сделать это будет следующим:

funList = {@Compute2BodyForce,@Compute3BodyForce,@ComputeOtherForce};

dataList = {data1,data2,data3}; %# or pass file names 

parfor i=1:length(funList)

    %# call the function

    funList{i}(dataList{i});

end

Во-вторых, как мне объединить результаты исуммируйте их вместе, а именно, чтобы получить TotalForce = 2BodyForce + 3BodyForce + OtherForce?

1 Ответ

2 голосов
/ 06 июня 2011

Вы на правильном пути.Но, насколько мне известно, вы не можете использовать анонимные функции в 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.Документация довольно хорошая и гораздо более полная, чем все, что я мог бы здесь разместить.

Удачи.

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