我已經想出了一些加速我的MATLAB代碼的很棒的方法:vectorizing,arrayfun,基本上只是擺脫for循環(不使用parfor)。我想把它帶到下一步。在MATLAB中簡單的並行執行
假設我有2個函數調用是計算密集型的。
x = fun(a);
y = fun(b);
他們是完全獨立的,我想在並行而不是串行運行它們。我沒有並行處理工具箱。任何幫助表示讚賞。
感謝
我已經想出了一些加速我的MATLAB代碼的很棒的方法:vectorizing,arrayfun,基本上只是擺脫for循環(不使用parfor)。我想把它帶到下一步。在MATLAB中簡單的並行執行
假設我有2個函數調用是計算密集型的。
x = fun(a);
y = fun(b);
他們是完全獨立的,我想在並行而不是串行運行它們。我沒有並行處理工具箱。任何幫助表示讚賞。
感謝
如果我很樂觀,我認爲你問「我怎麼能簡單地做並行處理在Matlab」。在這種情況下,答案可能是:
並行處理最容易通過parallel computing toolbox完成。這使您可以訪問諸如parfor
之類的內容。
我想你可以這樣做:
parfor t = 1:2
if t == 1, x = fun(a); end
if t == 2, y = fun(b); end
end
當然也有other ways,但應該是最簡單的。
MATLAB解釋器是單線程的,因此跨MATLAB函數實現並行性的唯一方法是運行MATLAB的多個實例。並行計算工具箱爲您完成這一任務,並以PARFOR/SPMD/PARFEVAL等形式爲您提供方便的界面。您可以手動運行多個MATLAB實例,但您可能需要做相當一部分工作來組織工作你想要完成。
通常的例子涉及parfor
,這可能是從MATLAB的並行計算工具箱(PCT)中獲得並行性的最簡單方法。 parfeval
功能非常簡單,如this other post所示。 PCT較少討論的功能是job
s和task
s的系統,對於兩個完全獨立的函數調用的簡單情況,這可能是最合適的解決方案。擾流板:batch
命令可以幫助簡化簡單作業的創建(請參閱本文的底部)。
不幸的是,它並不像實施那樣簡單;爲了完整起見,這裏有一個例子:
% Build a cluster from the default profile
c = parcluster();
% Create an independent job object
j = createJob(c);
% Use cells to pass inputs to the tasks
taskdataA = {field1varA,...};
taskdataB = {field1varB,...};
% Create the task with 2 outputs
nTaskOutputs = 2;
t = createTask(j, @myCoarseFunction, nTaskOutputs, {taskdataA, taskdataB});
% Start the job and wait for it to finish the tasks
submit(j); wait(j);
% Get the ouptuts from each task
taskoutput = get(t,'OutputArguments');
delete(j); % do not forget to remove the job or your APPDATA folder will fill up!
% Get the outputs
out1A = taskoutput{1}{1};
out1B = taskoutput{2}{1};
out2A = taskoutput{1}{2};
out2B = taskoutput{2}{2};
這裏的關鍵是給createTask
作爲任務對象創建評估功能的功能myCoarseFunction
。這可以是你的fun
或者一個包裝器,如果你有複雜的輸入/輸出可能需要一個結構容器。
注意,對於單個任務,上面創建作業和任務,然後用submit
開始他們的整個工作流程可以簡化了batch
如下:
c = parcluster();
jobA = batch(c, @myCoarseFunction, 1, taskdataA,...
'Pool', c.NumWorkers/2 - 1, 'CaptureDiary', true);
另外,請記住,與matlabpool
(現在稱爲parpool
)一樣,使用parcluster
需要時間來啓動將執行作業的MATLAB.exe進程。
我得到'myCoarseFunction'的警告不存在 – 2014-05-27 21:52:34
@AhsanAli這是一個例子,假設你有一個叫'myCoarseFunction'的函數,這是你應該怎麼做的。 – chappjc
請告訴我如何在代碼中應用這個函數:'parfor ii = 1:1000 p {ii,1} = repmat ([2 4 5;],500,1);%假設非常大矩陣 pp {ii,1} = p {ii,1} * 2; 對於jj = 1:100 p1 {jj,1} = p {ii} * pp {ii}; p2 {jj} = p {ii} * pp {ii} * p1 {jj}; p3 {jj} = p {ii} * pp {ii} * p1 {jj } * p2 {ii}; 結束 數據(ii).data =( [pp(ii,:),p1 {:,1},p2,p3;])';數據(ii).label = cellfun(@(x)['label'num2str(ii)],num2cell(1:length(pp)+ length(p1)+ length(p2)+ length(p3))' 'UniformOutput',false); end' – 2014-05-27 23:45:49
'arrayfun'加速?我不這麼認爲。 'for'循環通常更快。至於並行化,請參閱'matlabpool' /'parpool':http://www.mathworks.es/es/help/distcomp/parpool.html –
請注意,最好的加速通常不是通過更快地完成計算來實現的,而是通過(只)以正確的方式計算正確的事情。 –
希望澄清一點點... – Chet