我有一個parfor循環通過說100次迭代,每個迭代的工作量是不同的,但線性變化的方式,第一個花費最多的時間和最後一個是最快的。但是當我用我的四個實例/實驗室運行parfor循環時,在最近幾個小時內只有一個實驗室處於活動狀態,因爲它正在通過它自己的幾個第一次迭代運行。Matlab的parfor工作分配
所以我知道哪些迭代是慢的。我怎樣才能讓內核之間的工作量更均勻。例如,不知何故,迫使所有實驗室開始研究前四個緩慢的實驗,然後按順序進行?或類似的東西,以防止只有一個活動的核心運行少數慢單獨..
我有一個parfor循環通過說100次迭代,每個迭代的工作量是不同的,但線性變化的方式,第一個花費最多的時間和最後一個是最快的。但是當我用我的四個實例/實驗室運行parfor循環時,在最近幾個小時內只有一個實驗室處於活動狀態,因爲它正在通過它自己的幾個第一次迭代運行。Matlab的parfor工作分配
所以我知道哪些迭代是慢的。我怎樣才能讓內核之間的工作量更均勻。例如,不知何故,迫使所有實驗室開始研究前四個緩慢的實驗,然後按順序進行?或類似的東西,以防止只有一個活動的核心運行少數慢單獨..
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;
我使用暫停來模擬不同的計算時間。
「因此,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)。 –
@ arne.b這是真的matlab並沒有真的把它分割成這樣。我的觀點是,指數範圍被分割成連續的大塊。如果所有時間密集型步驟彼此接近,則它們將處於相同塊中的可能性很大。我會更新答案。 – denahiro
我不認爲這是記錄在任何地方,但你可以快速推斷出PARFOR以反向循環順序運行迭代(如果你想看到它在運行中使用pause
和disp
)。所以,你應該簡單地扭轉你的循環。 PARFOR不給你明確控制執行順序的方法,但使用for-drange的SPMD確實(PARFOR雖然明顯易於使用)。
@ denahiro的建議也是一個很好的建議。
我認爲答案http://stackoverflow.com/questions/9937200/matlab-parallel-computing-toolbox-dynamic-allocation-of-work-in-parfor-loops/9939455#9939455可能感興趣給你。 –
我認爲[@Edric](http://stackoverflow.com/a/9938666/97160)在鏈接問題中給出了一個提示:「大致來說,PARFOR以相反的順序執行循環迭代,因此您可以將它們置於」結束「的循環,所以立即開始他們工作# – Amro
@HighPerormanceMark:這應該被視爲重複? – Amro