我認爲你引用的doc有一個很好的描述什麼被認爲是工作的靜態分配:每個工人「被分配一個固定的迭代範圍」。對於4名工作人員來說,這意味着首先被分配爲iter
1:250,第二個iter
251:500,...或第一個爲1:4:100,第二個爲2:4:1000,等等。
你沒有確切地說出你觀察到的情況,但是你所描述的與動態工作負載分配很好地一致:首先,四個(示例)工作者分別工作在一個iter
上,第一個完成了第五個工作,下一個完成(如果前四個中的三個需要更長的時間,這可能是相同的)在第六個等等上工作。現在如果你的離羣值是按照MATLAB選擇處理循環迭代的次數爲20,850和900,並且每次需要100次,這隻意味着第四次到第三十次迭代將由四個工人中的三個來解決,忙於第20次(到320會完成,現在假設非離羣計算時間大致均勻分佈)。然而,被分配了第850次迭代的工作者將繼續運行,即使在另一個已經解決了#1000,並且對於#900也是如此。實際上,如果有大約1100次迭代,那麼在#900上工作的那個應該大致在其他時間完成。
[編輯爲原單的措辭暗示MATLAB仍然會分配PARFOR循環迭代,以從1到1000,這不應該被假定]
所以長話短說,除非你想辦法首先處理你的異常值(當然這需要你先知道哪些是異常值,並找到一種方法讓MATLAB用這些異常值開始parfor循環處理),但動態工作負載分佈本身無法避免你觀察到的效果。
增加:我想,但是,你的觀察,作爲「環接近完成時,工人* 小號 *該評估的異常值繼續運行」,似乎暗示以下
的至少一個
- 異常值在某種程度上是最後迭代MATLAB開始處理
- 你有很多的工人當中,在迭代次數的數量級
- 你離羣值(2-3)的估計數或估他們的計算時間罰分(因子100)太低