2013-10-02 112 views
0

我已經想出了一些加速我的MATLAB代碼的很棒的方法:vectorizing,arrayfun,基本上只是擺脫for循環(不使用parfor)。我想把它帶到下一步。在MATLAB中簡單的並行執行

假設我有2個函數調用是計算密集型的。

x = fun(a); 
y = fun(b); 

他們是完全獨立的,我想在並行而不是串行運行它們。我沒有並行處理工具箱。任何幫助表示讚賞。

感謝

+0

'arrayfun'加速?我不這麼認爲。 'for'循環通常更快。至於並行化,請參閱'matlabpool' /'parpool':http://www.mathworks.es/es/help/distcomp/parpool.html –

+1

請注意,最好的加速通常不是通過更快地完成計算來實現的,而是通過(只)以正確的方式計算正確的事情。 –

+0

希望澄清一點點... – Chet

回答

4

如果我很樂觀,我認爲你問「我怎麼能簡單地做並行處理在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,但應該是最簡單的。

+0

希望該編輯只是澄清... – Chet

+0

@Chet看到我的編輯 –

+0

我看到 - 我沒有並行處理工具箱,雖然:( – Chet

4

MATLAB解釋器是單線程的,因此跨MATLAB函數實現並行性的唯一方法是運行MATLAB的多個實例。並行計算工具箱爲您完成這一任務,並以PARFOR/SPMD/PARFEVAL等形式爲您提供方便的界面。您可以手動運行多個MATLAB實例,但您可能需要做相當一部分工作來組織工作你想要完成。

0

通常的例子涉及parfor,這可能是從MATLAB的並行計算工具箱(PCT)中獲得並行性的最簡單方法。 parfeval功能非常簡單,如this other post所示。 PCT較少討論的功能是jobs和tasks的系統,對於兩個完全獨立的函數調用的簡單情況,這可能是最合適的解決方案。擾流板: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進程。

+0

我得到'myCoarseFunction'的警告不存在 – 2014-05-27 21:52:34

+0

@AhsanAli這是一個例子,假設你有一個叫'myCoarseFunction'的函數,這是你應該怎麼做的。 – chappjc

+0

請告訴我如何在代碼中應用這個函數:'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