我不确定正确理解Haskell中静态和动态并行性之间的区别。
假设我有一个map函数,我可以使用parMap rdeepseq f xs
或map f xs `using` parList rdeepseq
轻松并行化。但这当然会产生太细的粒度。所以我使用parListChunk s rdeepseq
来获得更好的粒度。因此,我不是为每个列表元素创建火花,而是创建与核心数量(由-Nx
选项确定)一样多的火花,或者2-3倍以上,以实现灵活的负载平衡。
但事实上,我正在调整基于#cores一种动态并行形式的火花/线程的数量?我倾向于不相信。
如何实现动态并行?
答案 0 :(得分:0)
免责声明:我是parallelisim的业余爱好者
基于核心数量的分块似乎是错误的。相反,基于应该在单个核心上完成多少工作的块:足够重要以至于核心实际上必须咀嚼它,但足够小以至于整个任务可以以显着的方式分块(超过1个块)。只要单个块的工作量大大超过上下文切换和调度任务的成本,如果每个核心只有1个块,或者每个核心有1000个块,那么它就不会真正重要。如果你想要最小开销并行性,那么是的,将你的问题分解成块,这样你就可以为每个核心准确地安排1个块来完成任务。但是如果你想要动态并行,那么你需要了解调度的成本;将会有更多的开销和调度任务,但如果有足够大小的块,开销不会太大。如果一个任务被分成比没有内核更少的块,那么该任务可能不需要首先进行并行化。