2015-06-10 61 views
0

我在Matlab中有一個1乘P的數組R(p大)。我將它的所有條目初始化爲0,並且數組R的第i個元素將接收來自myfunction的輸出,應用於parameters(i)。換句話說:在Matlab中用spmd填充數組

R=zeros(p,1); 
for i=1:p 
R(i)=myfunction(parameters(i)); 
end 

相同的功能myfunction多次應用不同的輸入。由於p可能變大,我認識到一個spmd問題(單個程序,多個數據),並認爲使用spmd構造可以幫助以前的代碼更快地運行。

如果我運行matlabpool,我獲得了n_workers不同的實驗室。我的想法是將數組R分解成n_workers不同的部分,並要求每個可用的工作人員填充數組的一部分。我願做這樣的事情:

q=((p-1)-mod(p-1,n_workers-1))/(n_workers-1); 

lab 1: 
for j=1:q 
R(j) = myfunction(parameters(j)); 
end 

lab 2: 
for j=(q+1):(2*q+1) 
R(j) = myfunction(parameters(j)); 
end 

... 

lab n_workers: 
for j=(q*(n_workers-1)+1):p 
R(j) = myfunction(parameters(j)); 
end 

然而,由於我是新來的並行編程,我不知道如何寫這個正確的在Matlab。我可以使用coditributed數組來代替將陣列R細分爲自己的數組嗎?

回答

0

首先,如果你的函數評估是獨立的,你可能會更好使用parfor,就像這樣:

R=zeros(p,1); 
parfor i=1:p 
    R(i)=myfunction(parameters(i)); 
end 

spmd通常是唯一有用的,當你需要的迭代之間的通信。

spmd 
    R = codistributed.zeros(p, 1) 
    for i = drange(1:p) 
     R(i) = myfunction(parameters(i)); 
    end 
end 

在這種情況下,你可能也想使parameters是一個分佈式的陣列過,以避免多:在任何情況下,你可以使用for-drange construct這樣運行這樣的事情裏面spmd在內存中複製。 (parfor通過「切片」自動避免該問題)Rparameters