并行软件优化三步走

提高并行软件的性能需要采用结构化的方法,充分利用开发资源,快速取得出色成效。本文将这种方法划分为三个不同阶段:

  • 阶段一:确立调节方法。最佳实践有助于您提前规划并按规划行事。
  • 阶段二:创建适当的工作负载。在调节前和调节后针对应用执行相同数量的操作使您能够衡量进度。
  • 阶段三:构建测试环境。适当的测试环境精确地模拟出实验流程中的生成。

这三个步骤共同作用,有助于软件开发机构高效优化软件,经过演进充分利用越来越多的处理器内核。

阶段一:确立调节方法

优化应用时需要注意的最重要的事项是创建系统化方法并遵循该方法。这意味着符合科学的方法并规划您的目标,然后执行计划。

顺利的开始

从规划流程中的第一次会话开始直到您认为应用已达到目标为止,一些规则对于您来说将非常宝贵:

  • 设定目标和实现这些目标的相关方法。优化非常困难,这是潜在的高成本工作,您需要知道要完成哪些任务,以便知道什么情况下获得了成功。比如,目标是在每枚内核上实现特定的处理器使用率,或改进线程模式,以支持在执行过程中实时运行新特性。
  • 确定过程中您所做的每次更改带来的影响。采用合适的工作负载(如下所述)使您能够衡量结果,以便准确了解您所做的每次更改的结果。
  • 详注。写下要对软件进行的所有操作及原因。在展示项目中做出的注释是使下一个项目更加成功所用知识库的基础(即使是非正式的知识库)。此外,这些注释还包括寻找工作负载开发中的缺点以及您如何克服它们。
确定步骤

有了这些严格的规则,您就可以创建相关的方法,决定要进行哪些变更,实施变更并衡量其对应用性能的影响。要了解的第一个方面是迭代、闭环循环,如图 1 所示。步骤(与循环有关的一次迭代)的每个序列设计、实施和验证应用代码的一次(仅一次)变化:

  • 收集性能数据。每次迭代的第一步是利用相应的标准(后文将讨论工作负载和标准)应用工作负载并衡量性能。此外,后文还将讨论英特尔® Concurrency Checker,这项工具有助于确定该步骤中的线程行为。
  • 分析数据并确定问题。接下来,您必须确定改进的机会,通常利用英特尔® Vtune 可视化性能分析器(Intel® VTune Performance Analyzer)查看时间消耗在哪些方面,或是利用英特尔® Thread Profiler 查看线程低效性。
  • 生成替代方案解决问题。每个问题都有解决方法,这步旨在找到解决目前问题的方法。
  • 实现改进。一旦您确定计划更改的方面,注意在您的项目记录中对代码进行相应的更改。
  • 测试结果。收集额外数据,将其与基准测量指标进行对比,了解结果,如必要,进行回溯处理。


图 1. 性能优化的闭环循环

为性能调节项目创建方法需要采用这种常规序列步骤,并确定如何对具体案例进行证明。在项目调节阶段开始前进行如此操作会奠定坚实的基础,以防止在后续过程中出现失误。

注意事项

结束本章节的讨论前,有几点需要注意:

  • 不要忽略最终用户系统的完整度。您测试应用所采用的平台将代表最终用户环境。仅优化旧系统或仅设计新系统与客户的预期结果相差巨大,因此工程师不仅要关注未来设计还要在传统设备提供相应的性能。
  • 一次不要更改一个以上方面。尤其是在并行平台的优化过程中,更改的原因和效果可能不会如您所料。如果在两次衡量之间进行一次以上更改,其效果可能会相互抵消,或者如果产生负面结果,您可能不知道是哪次更改引起的。
  • 不要更改硬件。如果可能,专门使用一个计算机系统作为测试平台,不要在调节过程中进行任何变更。仅安装或升级其它软件可能会使您的测试数据变得混乱。还可采用系统镜像或恢复点,以确保每次在相同的硬件配置上进行测试。
有关性能调节器的阶段一的更多信息

软件优化指南第二版是一本最新作品,它融入了四位英特尔性能工程师的思路,有助于您构建出色的性能方法。


阶段二:创建适当的工作负载

上文所述的性能方法在投入使用前还需要一个关键组成部分:工作负载。实际上,工作负载处于调节流程的中心,选择恰当的工作负载对于项目能否获得成功发挥至关重要的作用。工作负载的目的是为应用提供一组任务,以便在调节过程中能够精确衡量性能调节产生的影响。

工作负载通常是本地事务

对于工作负载,我们不能采用一刀切式的方法。很多开发机构请英特尔性能工程师向他们提供可以在调节过程中应用的工作负载。但是,通常没有恰当的行动方法,因为工作负载视具体应用的不同而有所不同。它们旨在在测试中充分运行软件(参阅后文有效工作负载的特性)。

可以采用行业标准的性能指标评测,它是专用的工作负载,在某些情况下适用于性能调节实施。性能指标评测通常由协会或其它政府实体制定,旨在针对特定的具体使用情况,如衡量应用服务器或数据库的性能,提供有复验性的结果,以便参与竞争的软硬件厂商对比性能。

工作负载的范围广泛--从非常简单到非常复杂。例如,利用工作负载测试文件压缩程序性能可能与利用常用办公软件生成的一组文件一样简单。在这种情况下,应包括各种类型和各种大小的文件,文件的数量应足够多,以便使操作时间足够长,从而在连续的测试运行中轻松显示差异。

在其它情况下,更复杂的工作负载可能是应用于商务智能报告引擎的一组交易,例如,可能涉及对其中各种数据类型和资源的研究。由于某些报告类型可能需要数据挖掘行为,因此与多个数据来源及网络传输有关的变量是需要满足工作负载及相应方法需求的要素。


有效工作负载的四个特征

适当的工作负载必须具备以下特征:

  • 可衡量。运行工作负载的同时,必须采用一致可靠的方法衡量应用的性能。采用的标准将视测试中软件应用类型的不同而有所不同;例如,游戏可能使用每秒帧数量来计算、电子商务可能使用每秒业务量来计算,网络过滤器可能使用每秒包数量来计算。
  • 可重复性。在相同的一系列条件下,工作负载应产生尽可能类似的相同结果。由于无法控制的影响,如高速缓存状态和操作系统后台任务,可能产生轻微的变化,但这些变化必须非常小,以避免遮盖测试结果。关闭应用,如防火墙和病毒检查程序,同时提高工作负载的大小或延长测试的时间有助于最大程度降低外界的影响。
  • 静态。与工作负载相关的衡量不能随时间的变化而改变。这种问题可能干扰测试流程的一种情况是,当工作负载执行繁重的文件 I/O 工作时,不断地填充磁盘,文件读和写操作渐渐需要更长时间来执行,从而降低独立测试的性能(所做的改变作为调节方法的一部分)。
  • 代表性。在正常的操作条件下,执行的任务对系统施加的压力必须具有典型性。例如,它应运行尽可能多的代码库,并模拟正常的使用场景,而不是侧重于应用中的特定部分(团队事先决定关注)。
注意事项

我们已经讨论了良好制定的工作负载的主要特征,以下我们着重考虑相反的方面,以便增强理解。以下是开发机构可能经常遇到的几个问题:

  • 不要选择太小的工作块。如果测试中的工作量太小,那么测试结果的变化可能不突出。例如,如果在第一轮测试中,工作负载运行 10 秒,在下一轮测试中运行了 9.5 秒,那么使用秒表很难监测出它们之间的差别,尽管实现了 5% 的性能提升。请注意在某些情况下,通过测量工作负载在特定时间内的运行次数即可简单解决问题,而不是测量运行工作负载运行一次需要多长时间。
  • 不要只关注真实数据类型的子集。如果工作负载不包括各种可能性,那么它无法代表使用其它数据类型最能检测出的性能变化。例如,如果一项商务智能应用在导入特定数据类型方面出现瓶颈,那么想要解决这个问题需要在工作负载设计时考虑数据类型。
  • 不要花费太多时间试图创建完美的工作负载。无论在什么情况下,不存在完美的工作负载,我们的目标是利用良好的代码覆盖创建量化性能的工作负载,同时遵循上文提及的准则。提前为创建工作负载制定时间表,按时间设定创建。
有关性能调节器的阶段二的更多信息

服务器空间博客--服务器性能调节习惯 #5:了解您的工作负载按类推方法进行验证,并提供如何创建和充分利用性能调节工作负载优势的示例。


阶段三:构建测试环境

创建满足以上常用标准的工作负载后,为了满足正在优化的应用的特定需求,可以开始构建将进行实际调节的测试环境。

硬件选择和测试平台创建

如上文所述,专门的测试设备是进行测试的理想之选,因为它可最大限度地减少出现无法控制的变化(这种变化会扰乱测试结果)。此外,恰当的做法是选择最新的平台而不是可能无法精确运行的陈旧设备。性能调节是一项具有巨大价值的行为,应在一些行为中被予以关注,包括购买可模拟软件产品客户使用的典型目标系统的设备。

一旦选择测试系统,则在许多情况下必须创建测试工具,以便模拟可在真实条件下与测试系统实现交互的用户或外部系统。测试工具的设计复杂性非常重要,根据系统的要求,对于测试工具,非常必要的一点是稳定和高效,这样才不会人为影响测试结果。

考虑测试自动化工具和流程

测试流程的循环特性间接表明需要执行许多重复性任务,实际上,迭代和最终结果的质量之间存在着相关性。简单来说,这表示软件测试会变得枯燥,两种结果可能会令人不快,并且流程中可能会产生错误。使测试流程实现自动化是一项非常有用的方法,可提高效率和结果的精确度,同时以智能的方式缓解乏味。

在这项工作中,各种自动化工具,如 AutoIt*、AutoMate* 和 QuickMacros* 发挥着重要的作用,许多工具可免费使用。您选择的工具应支持最大程度地与已采用的其它流程和工具整合。这些工具通常支持此类整合,而利用如 PERL* 或 Windows* PowerShell 等方法定制脚本是提供更大灵活性的又一选择。

流程的另一个有用的附件是免费的英特尔® Concurrency Checker,它有助于验证应用线程是否同时运行。通过在进行特定的代码改进前后运行应用并对比测量结果,您可以利用这项工具衡量性能。通过已命令行/脚本模式运行,该工具整合至自动化的测试流程中,或者,您也可选择通过图形用户接口运行。英特尔® Concurrency Checker 的一个优势是可在不访问应用源代码的情况下被加以利用,这非常有用,例如,在测试可能影响整体系统的其它公司专有软件并行性的过程中。

满足测试系统设置和代码变化的需求

请注意,尽管如上文所述,一旦您建立了硬件测试系统,您应注意不要在无意中更改任何硬件组件,但是,性能调节有时需要故意对测试系统进行改变,如,BIOS 或服务器配置设置。在这种情况下,对测试系统的变化是针对测试迭代所做的专门变更(代码未发生变化的情况下),这样,这种方法仍满足以上所述的规则,仅改变测试环境内的一个因素。

有关性能调节器的阶段三的更多信息

企业家网络的自动化软件页包括一组可用于自动化实施重复性任务(如调节过程中的任务)的程序。


结论

尽管理解制定调节方法和构建工作负载的要求非常困难,但它们是提高并行硬件上软件质量的必要基础。这项准备工作有助于确保您获得良好的结果,发挥软件的最大优势,并为您的产品赢得最有利的竞争地位。
一旦完成本文所述的任务,您便可以找到代码中的瓶颈。将这些问题转化为机遇正是性能调节的宗旨。

社区共享

告诉我们您在性能调节并行应用中所获得的结果,包括哪些有效,哪些无效,与行业同仁和英特尔专家沟通,解决主要问题(或帮助其他人解决问题):
社区论坛:基于英特尔® 并行架构的线程技术

深入研究的资源

本文为您提供可改进性能调节工作的资源,以下站点将有助于您更出色地实现性能调节:

类别:
如需更全面地了解编译器优化,请参阅优化注意事项