Sev*_*ess 5 parallel-processing matlab load-balancing
我在matlab中使用长时间运行的parfor循环.
parfor iter=1:1000
chunk_of_work(iter);
end
Run Code Online (Sandbox Code Playgroud)
每次运行通常有大约2-3个定时异常值.也就是说,每执行1000次大量的工作,其中2-3次比其余工作长约100倍.随着循环接近完成,评估异常值的工人继续运行,而其余工人没有计算负荷.
这与静态分配工作的parfor循环一致.这与此处的并行计算工具箱的文档形成对比:
"工作分配是动态的,而不是被分配一个固定的迭代范围内,工人被分配一个新的迭代后,才处理完自己的当前迭代,这导致即使工作负荷分配."
关于发生了什么的任何想法?
我认为你引用的文档有一个很好的描述,它被认为是静态的工作分配:每个工作者"被分配一个固定的迭代范围".对于4名工人,这将意味着在第一被指派iter
1:250,第二iter
251:500,...或1:4:100为先,2:4:1000用于第二等等.
你没有准确地说出你所观察到的内容,但是你描述的内容与动态工作负载分配完全一致:首先,四个(示例)工作者分别处理一个iter
,第一个完成工作在第五个,下一个工作在第五个完成(如果前四个中的三个需要更长时间,可能会相同)在第六个上工作,依此类推.现在,如果您的异常值按照MATLAB选择处理循环迭代的顺序为数字20,850和900,并且每次迭代需要100倍,这仅意味着第二次到第320次迭代将由四个工作者中的三个解决,而一个是忙于第20次(到320将完成,现在假设大致均匀分布非离群值计算时间).然而,被分配第850次迭代的工作人员将继续运行,即使在另一次解决了#1000之后,#900也是如此.事实上,如果有大约1100次迭代,那么#900工作的那个应该大致在其他的时候完成.
[ 编辑为原始措辞暗示MATLAB仍然会按1到1000的顺序分配parfor循环的迭代,不应该假设]
长话短说,除非你找到一种方法来首先处理你的异常值(这当然要求你先验知哪些是异常值,并找到一种方法让MATLAB用这些开始parfor循环处理),动态工作量单独分配无法避免你观察到的影响.
另外:我想,但是,你的观察,作为"环接近完成时,工人*小号*那个评估的异常值继续运行"似乎暗示至少下列之一