C++多核高级编程 - 07 应用程序并行设计方法 (PADL 和 PBS)

来源:互联网 发布:青岛知豆电车怎么租啊 编辑:程序博客网 时间:2024/06/08 07:54

一,为大规模多核处理器设计应用程序

如果有成百个或上千个并发执行的线程或进程,如何设计或如何管理IPC则是一件非常令人生畏的事情。“应用程序设计” 本身就是一个非常宽泛的术语。对于不同类型和级别的开发人员这个术语有着不同的含义。其实软件和应用程序也有着各种各样的分类。下表是美国计算机协会(Association of Computing Machinery ACM)的 CCS(Computing Classification System)的一部分的摘录。

本章更为注重分析的方式,但所有的分析方式都有一定的适用场景和自己相应的不足,所以这章内容可以在开发过程中有所借鉴,完全照搬并不一定可取。

ACM分类号软   件多  用   户单  用  户H.4.1办公自动化群软件
项目管理
时间管理字处理
电子表格H.4.3通信应用程序远程会议
电视会议
计算机会议电子邮件
信息浏览D.2.2软件开发软件库编辑器D.2.3编码工具和技术软件代码维护编译器
链接器D.2.4软件可靠性验证  I.3.3图像生成高级可视化
虚拟环境数字化合扫描
图形包I.3.4图形实用工具虚拟现实系统动画I.3.53D图形 3D渲染
软件分类可以帮助我们对于同一类的软件在设计阶段就可以考虑并行设计方式。并且使用相对成熟的模型来提高开发的效率和可靠性。



二,并行应用程序设计层 (Parallel Application Design Layer )PADL

PADL是一个并行软件的分析模型。可以帮助组织软件的分解工作。共分5层,从顶向下逐步接近操作系统和编译原语的细节。
这本身是一种分析方式,不一定适用于所有的项目,但是一个不错的参考。

PADL的应用程序并行设计层
pdal_5


第五层是应用程序框架的选择,在开发过程中这是一个最关键的决定之一,其他的设计开发工作都将围绕框架展开。框架一旦决定,更改的代价将是非常昂贵的。

第四层确定了应用程序将要使用的并发模型。架构必须有足够的灵活性来使用所需要的并发模型。并发模型也需要有足够的灵活性来支持架构。

第三层开始确定应用程序的框架,模板类的层次,组件,谓词库和算法模板。

第二层表示应用程序到操作系统的接口。第三层中的API会和第二层的操作系统API发生交互和协作。

第一层软件的应用程序被分解成最低级别的细节。


第四层,第五层被认为是设计层,第三层到第一层为实现层,第三层为软件应用程序开发所保留,第二,一层为系统级软件开发所保留。
下面将对第五,四,三层作更为详细的介绍。

第五层:应用程序架构选择

在第五层中我们主要考虑的目标是应用程序的概念性或逻辑结构。与平台,操作系统和计算机完全无关。
在这里将介绍2种主要的架构,或者可以理解为问题解决方式和工作模式。这是2种可以支持大量并发的模型,这两种工作方式侧重点也并不一样。

  • 多agent架构: 捕获面向目标的工作模式
  • 黑板架构:捕获面向状态的工作模式

多agent架构

1) agent概念
关于agent的概念争议较大,也比较模糊,例如软件代理,软件智能机器人,智能对象等等。在资料中一个比较官方的定义是:agent是一个域中基本的行动者,它将一种或多种服务能力合并到统一且集成的执行模型中,该模型可以包含对外部软件、人类用户、和通信设备的访问。

其实如果用一些特性来描述agent效果会更好:

特性1:  自治或半自治
在问题解决过程中agent有自己的职责。它可以完成问题解决过程中自己独立的片段,或自己决定该如何行动。


特性2: 位于某地的
agent对周围的环境敏感,但单独的agent经常并不了解他所处的完整的领域。


特性3: 交互的
他们会构成集合体,相互协作完成特定的任务。从某种角度上说,他们构成了“社会”。


特性4: agent的社会是有结构的
在多数面向agent的问题解决中,尽管每个agent有着自己独特的环境和技能,但在正个agent的解决中,agent还是相互协作的。


特性5: agent社会协作结果要比单个agent贡献总和大
多agent,指由两个或以上agent组成的,必要时可并行执行的基于agent的结构。


2) 从问题陈述到agent架构
在软件开发中问题分解是一个主要的挑战,针对这个挑战主要的应战方法是找出问题的模型和适当的解决方案模型。下面将用一个猜数字的例子来演示如何将问题映射为agent 模型。

问题描述:一个包含6个字符的编码,编码包含的字符可以重复,字符为数字和字母。任务是找出字符的编码。有时间限制,2分钟之内。此外,还有个编码小助手,助手的任务是设置初始化密码,如果程序在15秒之内已经做出了超过N次不正确的猜测,它会设置一个新的密码,并且保证新的密码是在已经做出猜测之内的。

策略:6个字符编码的总共的可能性为(n-1+r) ! / (n-r) ! * r ! 本例中n 为36(0-9,a-z),而r为6。可以尝试把密码组合分成多组,例如8组,64组或128组,针对每组启动线程。

观察:根据规则如果在15秒内出现了N次不正确的猜测,助手会将编码改为已猜过的编码集合中的一个。但N是多少并不确定,所以一定要在单位时间里做出尽可能多的猜测。如果遍历了所有的编码而没有找出密码,可以推测出编码在2分钟内发生了变化。此时需要加快猜测的速度,来进行应对。


多agent下的问题模型和解决方案模型

通过问题的陈述,最初我们可以轻易的发现我们同3个agent在打交道。可以尝试用agent术语来描述问题。Agent A 为Agent B 提供编码,Agent C 试着猜测 Agent B 的编码。如果15秒内,Agent C提出了过多的猜测,Agent A 会在Agent C 已猜过的集合中选一个给 Agent B。如果Agent C猜测了所有的组合但没有发现密码,但还有时间剩余,Agent C 会用更快的方式来进行猜测。Agent C可以招募一支agent 队伍来为它服务。

尝试用UML中的活动图来描述

agent_stat
图中表现了多agent的交互。


黑板架构

1)  黑板的概念
 
黑板是一种协同解决问题的方法,主要用来在两个或多个基于软件的问题解决者间进行记录,沟通和协调。
主要组件:

  • 黑板 :是一个集中对象,每个问题解决者都能够使用它,问题解决者可以读写黑板内容。除了问题外,黑板还可以包含相对详细的属性。
  • 问题解决者:是一个软件,通常在某一领域有专门的知识或处理能力它们被称作知识源(Knowledge Sources)。问题解决者不需要同构,采用不同技术也是可以的。

黑板架构中,没有指定任何黑板的特定结构或布局,其结构主要和问题相关。黑板架构中主要描述黑板和知识源的关系而不是其结构。

黑板架构可以使用不同的内存布局  黑板和知识源位于同一内存空间,黑板和知识源位于不同一内存空间


black_board_memory


2)  黑板的设计方法

下面将使用一个简单的实例来看看如何将问题转化为黑板架构。

问题描述:假定需要一个特点领域的浏览器(允许用户在某个狭小主题或特定主题内搜索信息 例如:机器人,架构等)。用户可以使用图形界面进行操作。对于用户的特定问题,浏览器可以返回一个完整的答复。

分解:分解问题的实质其实是对问题提出更多更细节的问题,针对这些问题给出答案,这样才能更接近问题的实质。
针对浏览器的特点,提出了以下一些问题:

  • 提问题所使用的人类语言是软件了解的吗?
  • 问题的主题是软件信息中已有的吗?
  • 问题是否被清楚而无异议的描述了?
  • 问题中是否会有拼写错误?
  • 软件如何应对问题的含义?
  • 语言的语法(句法,语义,词法)是什么?
这些问题基本上也就是对软件的一个粗糙认识的过程。


解决方案的组成:在回答上述问题的过程中,我们基本还处于对软件本质一个粗糙的认识阶段,但这一阶段基本能够确定我们软件解决方案的基本的构成。

通过思考上述问题,我们发现我们可能需要解析器,单词专家,句法分析,语义分析等模块。在最开始解析识别单词(包括识别拼写错误的单词),句法分析==>>语义分析。这些都是我们解决方案中的基本组成部分。

通过黑板架构我们就有了相应的问题解决者  --->知识源

  • 为未知的或拼错的单词查找字典
  • 将问题分解为不同的词性
  • 理解词法
  • 理解词义
  • 语用分析
在PADL第五层的分析中我们并没有涉及到线程或系统的概念,我们只是针对软件要解决的问题进行分析,利用不完整的阶段信息展开工作,尽可能的识别出并行的部分。
在我们看到的上述的知识源中,他们基本都具有自治的能力,非常适合成为并行的对象。

知识源的自治能力是对并行最重要的支持。


第四层

第五层中选择的应用程序架构必须足够灵活以支持第四层中的并发模型,而且应用程序中可能包含不止一种并发模型。
下表给出了针对上面两个例子的架构和并发模型的映射关系。 架构并发模型PRAM模型SIMD/MIMD猜编码agent多 agent对等CRCW或CREWMIMD问答浏览器黑板boss-workerEREWSIMD

这种映射表其实并不一定唯一,例如黑板架构也可以认为是一个从单词识别到语用分析的流水线的并发模型。
并且可以随着对系统的深入,引入更多更合理的并发结构。


PADL第四层,第五层主要是概念设计层,它是系统的蓝图,找出系统中并行的位置,并尽量和成熟的并行模型相匹配。


第三层

第三次的分析由选择应用程序的框架,模板类,类库,类层次结构,算法模板,谓词和容器类构成。这些内容应为第四层的分析服务,并提供一个灵活的框架。
书中摘取了部分boost代码的实例,演示了如何将多线程进行封装,并提供更为实用的接口。在软件中把POSIX类库进行封装,对于开发来讲虽然增加了工作量,但还是有益处的。

  • 控制可调用接口的数量,以免调用大量不同的POSIX接口或属性,便于定位问题和修改
  • 便于控制日志和提供调用信息
  • 可以提供功能更强的组合使用,例如线程池,消息队列等
  • 使开发人员专注于业务的任务编程而不是陷入底层线程控制等问题

可供选择的第三方的库还是非常多的例如:

1) boost  www.boost.org 免费的库

2) Inter 线程构建块
目的:
  • 指定任务而不是线程
  • 强调数据并行编程
  • 利用并发


3) C++并行开发库 及 (STAPL  Standard Template Adptive Parallel Library)
将是新C++标准的一部分,使开发和PADL分析方式相一致。开发人员专注于高级业务,从而隐藏并发的细节。

三,谓词分解结构

应用程序的谓词分解结构(PBS),将应用程序分解为一组语句,他们描述了应用程序的断言和工作模式。
谓词是为true或false的语句。

谓词分解结构把自然语言描述的问题域进行提纯,描述了应用程序的运行规则,约束条件,对象间关系等等,使问题更加的简化。

怎样运用谓词分解结构呢?  我们可以通过前面猜密码的例子来演示一下:

猜密码谓词PBS分解:

分解1:如果您的猜测正确及时,则您赢得游戏。
分解2:如果您的输入是(0-9,a-z)的6位字符串,则您的输入正确,并提交agent
分解3:如果输入正确,并在2分钟之内,您的输入是及时的
分解4:如果有足够的agent进行运算,则对密码的穷尽查找将会成功
分解5:N个agent足够从400万的编码样本中找到密码
分解6:如果每15秒钟改变一次密码,则需要4N个agent来进行运算


这些语句的结果只有true和false,程序如果按其方式运行则可以达到我们的目的。

PBS完成后可以帮助PADL第五层 和 第四层的设计工作,有更严谨的约束条件可以保证在设计过程中的偏差会更小。



原创粉丝点击