多核时代:并行程序设计探讨(8)——任务分解模式Task Decomposition

简介:

                                                              Task Decomposition

从本章开始我们就正式来介绍每个模式了,参考设计模式的做法,每个模式我们都按照如下的内容进行介绍:问题(Problem)、上下文(context)、考虑因素(Forces)、解决方法(Solutions)。至于样例,就请各位看官直接看原文了。

 

1.1        问题

如何将待解决的问题分解为能够并行运行的“任务(task)”?

“任务”这个词本身是比较概念化的,没法精确衡量,因此分解得是否合理、是否优秀就要看设计师的水平了,但以我个人的经验,分解时至少要保证任务是一个级别的。例如建房子,你可以分解为设计、建造、装修三个任务,建造又可以分为打地基、框架建造、砌墙(仅供举例用,专业人士勿笑)等任务,但不要把设计和打地基甚至安装煤气管道都算作一个级别的任务。

1.2        上下文

所有的并行算法设计都开始于同一个起点:对问题很好的理解。设计师必须理解问题中计算强相关的部分、关键数据结构,以及数据如何用作问题的解决的。

接下来就是识别出组成问题的任务、以及任务包含的数据,本质上来说每个并行算法都包含一组能够并行运行的任务,关键的挑战就在于找到这些任务然后设计出一个算法让这些任务并行运行。

有的情况下,问题本身就天然的分解为一组相互独立的任务,这种情况就比较容易采用基于任务分解(task-based decomposition)的方式开始进行分解;而有的情况下,问题很难分解为独立的任务,这种情况下采用基于数据分解(Data-Based decomposition)是更好的选择。

通常情况下并不是很容易看出应该采用哪种方法,这个时候就要两种都考虑。但无论哪种情况,最后都要输出能够并行运行的任务。

1.3        考虑因素

1.3.1   灵活

此时考虑灵活性主要是为了能够让设计能够满足不同的实现需求,这里的实现就是具体采用的技术,例如采用Java编程,采用多CPU的小型机运行等,如果客户不强制要求,在这个阶段就不要限制这些。当然如果问题里面本身已经包含了这种实现,那就必须考虑这种实现的限制了。例如客户要求只能运行在小型机上面,那么设计的时候就需要考虑小型机的特点对人物分解的影响了。

1.3.2   有效

并行程序只有在随着并行计算机的规模增大时效率能够按比例增长才有意义。对于任务分解来说,这就意味着我们需要足够的任务来使得所有计算机都处于忙碌的状态。

通过使每个任务有足够的工作(Work)来弥补管理任务间的依赖带来的效率损失才能达到这点。当然,效率提升会带来灵活性的降低。

1.3.3   简单

再怎么好的程序也要人维护吧,所以再怎么复杂怎么好都要考虑怎么维护。

以上三种因素互相制约,具体怎么平衡,还是要看设计师的水平。

1.4        解决方法

任务分解的两个关键点:

1、保证任务间足够独立,这样花费很小的代价就可以管理任务间的依赖关系;

2、保证任务能够均匀的分布在所有的可执行单元上,这样能够充分利用系统性能;

 

任务分解的步骤:

1)首先识别尽可能多的任务,因为识别出很多任务后再合并比识别很少的任务再分解要容易得多。

2)识别出任务后,接下来就要分析任务中包含的数据的分解了,数据的分解在下一篇介绍。

 

那么,哪些地方能够发现任务呢?

1函数调用:调用函数的地方就是一个任务,如果每个函数调用都作为一个任务,则这种分解方式又叫“函数分解”。这里的函数是算法级的,不是代码级的,例如书中给的样例采用蒙特卡罗算法来进行图像分析合成,其中蒙特卡罗算法就是一个函数,也可以理解为功能(英文都是function)。ss

2算法循环:另外一个能够找到函数的地方就是算法中的循环了。如果很多循环彼此独立,这样可以采用每个循环一个任务的分解方法,这种分解方法又叫做“循环分解”。

3数据分解:若一个大的数据结构的不同部分分别被更新,则可以根据不同的数据块来划分任务,这种分解方法又叫做“数据分解”,后面会详细讲解数据分解的方法。

 

相关文章
|
算法 C++
OpenCV-白平衡(完美反射算法)
OpenCV-白平衡(完美反射算法)
776 0
|
Android开发 索引
鸿蒙开发:自定义一个车牌省份简称键盘
鸿蒙搞起来就比较的简单,直接一个Grid组件便可以搞定,最后的删除按钮,使用布局选项GridLayoutOptions便可轻松实现。
159 0
鸿蒙开发:自定义一个车牌省份简称键盘
|
机器学习/深度学习 PyTorch 算法框架/工具
空间金字塔池化(Spatial Pyramid Pooling, SPP)原理和代码实现(Pytorch)
想直接看公式的可跳至第三节 3.公式修正 一、为什么需要SPP 首先需要知道为什么会需要SPP。 我们都知道卷积神经网络(CNN)由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的则是第一个全连接层,因此基本上所有的CNN都要求输入数据固定大小,例如著名的VGG模型则要求输入数据大小是 (224*224) 。
2492 0
|
12月前
|
机器学习/深度学习 人工智能 芯片
【AI系统】超异构计算
本文探讨了计算机架构发展的黄金十年,重点介绍了异构计算和超异构计算的概念及其在AI芯片发展中的应用。文章首先回顾了AI芯片发展的三个阶段,随后详细阐述了异构计算的优势和应用场景,如性能飞跃、灵活定制、降低成本和降低功耗。接着,文章分析了超异构计算的出现背景、基本特征及其面临的挑战,包括软件层的复杂性和硬件定义软件与软件定义硬件之间的权衡。最后,展望了超异构计算的未来,强调了跨平台统一计算架构的重要性,以及构建开放生态系统的必要性。
643 5
|
前端开发 Java 应用服务中间件
JVM进阶调优系列(1)类加载器原理一文讲透
本文详细介绍了JVM类加载机制。首先解释了类加载器的概念及其工作原理,接着阐述了四种类型的类加载器:启动类加载器、扩展类加载器、应用类加载器及用户自定义类加载器。文中重点讲解了双亲委派机制,包括其优点和缺点,并探讨了打破这一机制的方法。最后,通过Tomcat的实际应用示例,展示了如何通过自定义类加载器打破双亲委派机制,实现应用间的隔离。
|
算法 安全 Linux
万字详解并发编程!!!
本文介绍了并发编程的基本概念和技术,涵盖了操作系统的发展历程、进程与线程的原理和使用方法。主要内容包括: 操作系统发展史:从手工操作到多道程序系统、分时系统、实时系统,再到通用操作系统,逐步介绍了操作系统的演变过程。 并发编程技术:强调并发编程的目标是充分利用CPU资源,提高系统性能 进程:详细讲解了进程的概念、组成、状态、调度算法、进程间通信(IPC)以及守护进程和僵尸进程等问题。 线:介绍了线程的基本概念、与进程的区别、线程的创建、多线程共享资源、线程同步与互斥锁、递归锁和死锁问题 5. **队列**:讲解了队列的基本概念,包括先进先出队列、后进先出队列和优先级队列,并提供了具体的实现示例
654 38
|
存储 机器学习/深度学习 测试技术
[大语言模型-论文精读] 以《黑神话:悟空》为研究案例探讨VLMs能否玩动作角色扮演游戏?
[大语言模型-论文精读] 以《黑神话:悟空》为研究案例探讨VLMs能否玩动作角色扮演游戏?
|
人工智能 缓存 安全
阿里云服务器实例规格性能参考:从五代到八代及经济型e与通用算力型u1
阿里云不断推出新一代的云服务器实例规格,以满足不同用户的多样化需求。本文将介绍阿里云服务器从五代到八代的实例规格,以及经济型e和通用算力型u1这两种热门实例规格,帮助用户更好地选择适合自己的云服务器。
阿里云服务器实例规格性能参考:从五代到八代及经济型e与通用算力型u1
|
关系型数据库 MySQL 数据库
如何使用Docker部署MySQL数据库?
【10月更文挑战第1天】如何使用Docker部署MySQL数据库?
640 0