多核时代:并行程序设计探讨(10)——任务分组模式Group Task Pattern
任务分组模式Group Task Pattern
1.1 问题
一个问题的多个任务如何聚集成一组,以简化依赖关系的管理?
1.2 上下文
当任务和数据分解完成后,就可以应用此模式了。
任务分组模式描述了分析任务之间的依赖关系的第一步。在任务分解的过程中,我们按照任务可以并行运行来考虑,然而我们并没有强调一个很明显的事实:这些任务并不是组成一个扁平(译者注:指任务之间也是有层次关系)的集合。例如,继承于算法中同一个高级的操作的任务自然的应该组成一组。其它任务可能和初始问题没有关系,但在并行运行时存在相似的约束,因此也可以组成一组。
简而言之,任务集内存在一个值得考虑的结构。这些结构——指任务组——简化了问题的依赖关系分析。如下分析:
1) 如果一个任务组共享一个时序的约束(例如等待一个任务组完成文件的填充),我们可以一次满足整个组的约束;
2) 如果一个组必须在一个共享数据结构上一起工作,整个组的同步可以一次解决;
3) 如果一组任务互相独立,那么把它们组成一个独立的组然后在运行时作为一组同一调度,则可以简化设计并且提高并行性,因此可以让整个解决方案分布到更多的处理单元上。
以上无论哪种情况,思想都是通过定义共享相同约束的任务组,以及通过处理一组任务而不是单个任务来简化约束管理。
1.3 解决方法
任务间的约束可以划分到如下主要的几类:
1)最容易理解的依赖就是时序依赖:即一组任务顺序运行时存在的约束。如果任务A依赖于任务B的结果,则A必须等到B运行完毕后才能运行。我们经常把这种情况叫做数据流:任务A阻塞直到任务B准备好数据,当任务B结束后,数据就流向A了。
2)另一种顺序依赖就是指一组任务必须同时运行。例如,在很多“数据并行(data-parallel)”的问题中,原始问题划分为多个可以同时更新的区域。典型的情况为,任何指定区域的更新需要其相邻区域的边界信息,如果所有区域没有同时处理,则并行程序将停止或者死锁,因为某些区域要等待不活动区域的数据。
3)某些情况下,任务组中的任务是互相独立的,这些任务并没有顺序执行的约束。这是一个重要的特性,因为这意味着这些任务可以以任何顺序执行,包括并行执行。
没有一个简单的方法来发现任务组。我们建议按照如下方法进行操作。但要记住不能不考虑约束本身而去考虑任务分组,在这个设计点上,最好的方法是尽可能的抽象——识别约束然后将任务分组以解决这些约束,但是不要陷入到细节的泥沼中去。
1) 首先,关注初始问题如何分解。大部分情况下,高层的操作或者大的循环结构在分解中扮演关键的角色,这是第一个寻找任务组的地方,属于同一高层操作的任务自然的就划为一组了。
这样划分后,可能有很多小的任务组。接下来我们将关注那些由一个任务组内的任务共享的约束,共享同一约束的任务划为一组。
2) 其次,我们需要问是否有其它任务组共享相同的约束。如果有,将任务组合并。大的任务组提供了额外的并行性,使得更多的处理单元运行;同时也提供了额外的任务调度的灵活性,使得在处理单元间进行平衡也更加容易。
3) 接下来的步骤要关注任务组之间的约束。如果任务组间有明确的时间顺序,或者任务间有明确的数据流,这种情况很简单。更复杂的情况是独立的任务组之间以另外方式共享约束。这种情况下,将这些任务组合并成一个更大的任务。
最后更新:2017-04-02 04:01:42
上一篇:
百度有啊前端框架分析(浏览器内置事件)
下一篇:
企业服务总线ESB的概念及应用
金融安全资讯精选 2017年第十期 中国台湾远东银行遭黑客入侵被盗六千万美元,GDPR成了欧洲企业“最担心的挑战”,CISO在企业中的位置会变得更加重要
使用 Axel 命令行下载器/加速器加速下载
试用Office 365 家庭高级版的十大理由
实践重于理论——创建一个监控程序探测WCF的并发处理机制
关于CDN那些名词,你知道吗?
5月教程月|ECS服务器挂载云盘(非普通云盘)图文教程
《SAFe 4.0参考指南:精益软件与系统工程的规模化敏捷框架》SAFe原则
打造高效前端工作环境-tmuxinator
你的变量究竟存储在什么地方 && 全局内存
SSH整合时sessionFactory or hibernateTemplate is required异常