什么是动态并行?

时间:2012-02-09 17:01:45

标签: haskell dynamic parallel-processing

我不确定正确理解Haskell中静态和动态并行性之间的区别。

假设我有一个map函数,我可以使用parMap rdeepseq f xsmap f xs `using` parList rdeepseq轻松并行化。但这当然会产生太细的粒度。所以我使用parListChunk s rdeepseq来获得更好的粒度。因此,我不是为每个列表元素创建火花,而是创建与核心数量(由-Nx选项确定)一样多的火花,或者2-3倍以上,以实现灵活的负载平衡。

但事实上,我正在调整基于#cores一种动态并行形式的火花/线程的数量?我倾向于不相信。

如何实现动态并行?

1 个答案:

答案 0 :(得分:0)

免责声明:我是parallelisim的业余爱好者

基于核心数量的分块似乎是错误的。相反,基于应该在单个核心上完成多少工作的块:足够重要以至于核心实际上必须咀嚼它,但足够小以至于整个任务可以以显着的方式分块(超过1个块)。只要单个块的工作量大大超过上下文切换和调度任务的成本,如果每个核心只有1个块,或者每个核心有1000个块,那么它就不会真正重要。如果你想要最小开销并行性,那么是的,将你的问题分解成块,这样你就可以为每个核心准确地安排1个块来完成任务。但是如果你想要动态并行,那么你需要了解调度的成本;将会有更多的开销和调度任务,但如果有足够大小的块,开销不会太大。如果一个任务被分成比没有内核更少的块,那么该任务可能不需要首先进行并行化。