2013-10-05 192 views
4

我想並行塊2的每個塊1,太parallerlize外環。在MATLAB使用PARFOR嵌套循環

以前的代碼:

for i=rangei 
     <block1> 
     for j=rangej 
      <block2> dependent on <block1> 
     end 
    end 

改變代碼:

parfor i=rangei 
     <block1> 
     parfor j=rangej 
      <block2> dependent on <block1> 
     end 
    end 

多少效率可在此獲取和將改變的代碼做正確的事? 更改後的代碼是否符合我的要求?

回答

5

在MATLAB,parfor不能嵌套。這意味着,在您的代碼中,您應該用for(最有可能的外部循環)替換一個parfor。更一般地說,我建議你看看這個tutorial on parfor

0

不能使用嵌套PARFOR,從你的問題看來,你在一個矩陣工作(有參數I,J), 嘗試使用blockproc,通過這個鏈接,一旦blockproc

4

parfor不能嵌套。在嵌套parfor語句,才parfor最外面的呼叫paralellized,這意味着以parfor內呼叫只增加不必要的開銷。

爲了在parfor的情況下獲得高效率,迭代次數應該遠高於工作者數量(或者在每次迭代需要相同時間的情況下確切倍數),並且您希望單次迭代所花費的不僅僅是幾毫秒以避免感受到並行化的開銷。

parfor i=rangei 
    <block1> 
    for j=rangej 
     <block2> dependent on <block1> 
    end 
end 

可實際上符合這個描述,這取決於rangei大小。或者,您可能想要嘗試將嵌套循環展開爲一個循環,您可以在其中遍歷線性索引。

+0

實際上,人們可以觀察到parfor循環迭代是分塊的 - 所以每次迭代都不需要那麼小。當然,還有很多其他因素起作用,主要是與傳輸數據的開銷有關。 – Edric

1

以下代碼使用單個parfor循環來隱式管理兩個嵌套循環。 loop1_indexloop2_index是範圍,並且loop1_counterloop2_counter是實際的循環迭代器。此外,爲了有更好的負載平衡,迭代器被放置爲相反的順序,因爲通常較高範圍值的負載比較小值的負載更大。

loop1_index = [1:5] 
loop2_index = [1:4] 

parfor temp_label_parfor = 1 : numel(loop1_index) * numel(loop2_index) 
    [loop1_counter, loop2_counter] = ind2sub([numel(loop1_index), numel(loop2_index)], temp_label_parfor) 
    loop1_counter = numel(loop1_index) - loop1_counter + 1; 
    loop2_counter = numel(loop2_index) - loop2_counter + 1; 
end