多核时代:并行程序设计探讨(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)              接下来的步骤要关注任务组之间的约束。如果任务组间有明确的时间顺序,或者任务间有明确的数据流,这种情况很简单。更复杂的情况是独立的任务组之间以另外方式共享约束。这种情况下,将这些任务组合并成一个更大的任务。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值