2012-07-04 112 views
0

我有一個parfor循環通過說100次迭代,每個迭代的工作量是不同的,但線性變化的方式,第一個花費最多的時間和最後一個是最快的。但是當我用我的四個實例/實驗室運行parfor循環時,在最近幾個小時內只有一個實驗室處於活動狀態,因爲它正在通過它自己的幾個第一次迭代運行。Matlab的parfor工作分配

所以我知道哪些迭代是慢的。我怎樣才能讓內核之間的工作量更均勻。例如,不知何故,迫使所有實驗室開始研究前四個緩慢的實驗,然後按順序進行?或類似的東西,以防止只有一個活動的核心運行少數慢單獨..

+3

我認爲答案http://stackoverflow.com/questions/9937200/matlab-parallel-computing-toolbox-dynamic-allocation-of-work-in-parfor-loops/9939455#9939455可能感興趣給你。 –

+1

我認爲[@Edric](http://stackoverflow.com/a/9938666/97160)在鏈接問題中給出了一個提示:「大致來說,PARFOR以相反的順序執行循環迭代,因此您可以將它們置於」結束「的循環,所以立即開始他們工作# – Amro

+0

@HighPerormanceMark:這應該被視爲重複? – Amro

回答

2

Matlab parfor沒有什麼更多,但拆分索引和分發給他們的工人。它通過從索引創建連續的塊來完成此操作。我不知道確切的算法,但這意味着具有相似索引的數據在同一個塊和同一個worker中計算。

最簡單的解決方案將是一個隨機的解決方案。只需對您的指數進行洗牌,這樣工作密集的步驟就可以很好地分配。雖然這不能爲您提供任何性能保證,但它很簡單,並且大部分時間都可以使用。

一些示例代碼:

% dummy data 
N=10; 
data=1:N; 

% generate the permutated indices 
permIndex=randperm(N); 

% permute the data 
dataPermuted=data(permIndex); 

% run the loop 
parfor i=1:N 
    % do something e.g. pause for the time as specified by data 
    pause(dataPermuted(i)); 
end 

%invert the index permutation 
dataInversePermuted(permIndex)=dataPermuted; 

我使用暫停來模擬不同的計算時間。

+0

「因此,worker1會用i1 = 1:100和worker2 i2 = 101:200壓縮一切。」 - 你從哪裏獲取這些信息?它似乎與[以前鏈接的問題]中的答案相矛盾(http://stackoverflow.com/questions/9937200/matlab-parallel-computing-toolbox-dynamic-allocation-of-work-in-parfor-loops/9939455# 9939455)。 –

+0

@ arne.b這是真的matlab並沒有真的把它分割成這樣。我的觀點是,指數範圍被分割成連續的大塊。如果所有時間密集型步驟彼此接近,則它們將處於相同塊中的可能性很大。我會更新答案。 – denahiro

1

我不認爲這是記錄在任何地方,但你可以快速推斷出PARFOR以反向循環順序運行迭代(如果你想看到它在運行中使用pausedisp)。所以,你應該簡單地扭轉你的循環。 PARFOR不給你明確控制執行順序的方法,但使用for-drange的SPMD確實(PARFOR雖然明顯易於使用)。

@ denahiro的建議也是一個很好的建議。