概述
一、任务分解
任务的分解,是实现并行最容易理解和最容易为开发者所接受的。所有的软件的需求,都是从实际应用场景而来,而实际的应用场景中,哪些任务可以分解,分解后子任务间的依赖性,哪些子任务(组)可以独立执行不依赖其它子任务。这些都是软件实际开发中能不能够更高效的利用并行编程的前提和手段。
任务分解成N个子任务,是并行的最基本的方式。
二、分解的方法
任务的并行,可以从最简单的任务分解开始,任务分解有以下几种常见的方式:
1、简单的任务并行分解
最简单的任务分解,其实是从最初的需求中,分解出可以独立执行的任务。举一个做饭例子,妈妈要做中午饭,既要蒸米饭,又要洗菜,炒菜。还熬粥。那么这些工作如果先蒸好饭,再熬好粥,再洗菜,再炒菜,估计中午饭没熟就上下午班了。如果有过经验的知道,蒸饭和熬粥耗时都比较长,但前期准备短,而洗菜和炒菜只能串行。这样就可以用划分成三个子任务,这三个子任务间没有依赖,可以完全并行。这个任务分解的方式连普通的家庭妇女都可以做到并做好。
2、任务图方式的任务分解
任务图的分解,就是这样一种问题。在实际开发中,像简单的任务分解就可以解决的方式,往往是少数的,大多数的任务往往之间互相有依赖,那么这时候就可以通过任务图的方式来分解实现多个子任务。这里面常用的就是有向无环图(DAG),通过图中节点间的层次关系来实现任务组的并行。这个在后面会专门的说明。
3、动态任务的分解
实际的应用场景中,还会有更复杂的情况。比如任务的产生并不是固定产生的,而是因为某种条件的变化而产生的。换句话说,任务的产生是动态产生的。比如硬件处理软件中,每多一个硬件接口处理,就需要产生一个任务。而这种动态的任务分解又有两类:
1、非嵌套的动态任务分解
任务的动态产生后,每个任务(组)内不再产生新的任务。
2、嵌套的动态任务分解
任务动态产生后,产生的任务又有可能动态产生任务。
这种方式可以通过对整体任务的产生数量进行一个预定义,通过公用的一个数据结构来实现对任务的定时、定量的分解来适应硬件的并行任务。如果任务的分解不均衡可以通过任务窃取的方法来进行调整。
三、总结
世界上往往是没有两全的方法,解决并行操作,也不是分解任务一个方法可以做到,经常是和数据、数据流的分解揉和在一起,才能起到更好的效果。正如人得了病,往是一种药见效慢。几种药混合在一起,就能够快速的解决掉病患之苦。任务的分解不光是开发人员的工作,也是需求方的工作。双方更好的互动,把实际的应用场景认真分析,整理清楚。那么在后续的并行分解中,就会更容易更简单的解决问题。
更多请关注微信公众号:太平洋工作室
最后
以上就是无限路灯为你收集整理的多核和多CPU编程——任务的分解的全部内容,希望文章能够帮你解决多核和多CPU编程——任务的分解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复