我不确定是否能正确理解Haskell中静态并行和动态并行之间的区别。
假设我有一个映射函数,我可以很容易地使用parMap rdeepseq f xs或map f xs `using` parList rdeepseq将其并行化。但这当然会造成太细微的粒度。所以我使用parListChunk s rdeepseq来获得更好的粒度。因此,我可以创建与内核数量(由-Nx选项确定)一样多的火花,而不是为每个列表元素创建火花,或者创建2-3倍以上的火花以实现灵活的负载平衡。
但是,我根据#cores调整火花/线程的数量,这是一种动态并行吗?我倾向于相信不是。
如何实现动态并行?
发布于 2012-02-10 04:37:39
免责声明:我是parallelisim的业余爱好者
基于内核数量的分块似乎是错误的。取而代之的是,基于单个内核上应该完成多少工作的块:足够重要,以至于内核实际上必须吞噬它,但足够小,可以以重要的方式将整个任务分块(超过1个块)。只要单个数据块的工作量明显大于上下文切换和调度任务的成本,那么每个核心只有1个数据块或1000个数据块并不重要。如果你想要最小的开销并行性,那么是的,以这样的方式将你的问题分解成块,这样你就可以在每个核上恰好调度1个块来完成任务。但是,如果您想要dynamic parallelism,那么您需要对调度的成本有所了解;切换和调度任务的开销会稍多一些,但是对于大小足够的块,开销不会有太大影响。如果一项任务被分成比核心更少的块,那么任务很可能一开始就不需要并行化。
https://stackoverflow.com/questions/9215284
复制相似问题