您的位置:首页 > 运维架构 > 网站架构

64-ia-32架构优化手册(13)

2018-01-12 11:51 246 查看

第三章.优化指引总则

本章讨论可以提升运行在基于Intel微架构Haswell,IvyBridge,SandyBridge,Westmere,Nehalem,增强IntelCore微架构与IntelCore微架构的处理器上应用程序性能的通用优化技术。这些技术利用了在第2章“Intel®64 and IA-32 ProcessorArchitectures” 中描述的微架构。关注多核处理器,超线程技术与64位模式应用程序的优化指引在第8章“多核与超线程技术”,第9章“64位模式编程指引”中描述。

优化性能的实践关注在3个领域:

·        代码生成的工具与技术。

·        工作负荷性能特征的分析,以及它与微架构子系统的相互作用。

·        根据目标微架构(或微架构家族)调整代码以提升性能。

首先汇总工具使用的一些提示以简化前两个任务。本章余下部分将关注在对目标微架构代码生成或代码调整的建议上。本章解释了IntelC++编译器,IntelFortran编译器及其他编译器的优化技术。

3.1. 性能工具

Intel提供了几个工具来辅助优化应用程序性能,包括编译器,性能分析器以及多线程化工具。

3.1.1.Intel® C++与Fortran编译器

Intel编译器支持多个操作系统(Windows*,Linux*,Mac OS*以及嵌入式)。Intel编译器优化性能并向应用程序开发者提供对先进特性的访问:

·        面向32位或64位Intel处理器优化的灵活性。

·        兼容许多集成开发环境或第三方编译器。

·        利用目标处理器架构的自动优化特性。

·        减少对不同处理器编写不同代码的自动编译器优化。

·        支持跨Windows,Linux与Mas OS的通用编译器特性,包括:

-  通用优化设置。

-  缓存管理特性。

-  进程间优化(IPO)的方法。

-  数据引导的优化(profile-guided optimization,PGO)的方法。

-  多线程支持。

-  浮点算术浮点与一致性支持。

-  编译器优化与向量化报告。

3.1.2.一般编译器建议

总的来说,一个对目标微架构调整好的编译器被期望能匹配或超出手动编码。不过,如果注意到了被编译代码的性能问题,某些编译器(像IntelC++与Fortran编译器)允许程序员插入固有函数(intrinsic)或内联汇编对生成的代码加以控制。如果使用了内联汇编,使用者必须核实生成的代码质量良好,性能优先。

缺省的编译器选项定位于普通情形。一个优化可能由编译器缺省做出,如果它对大多数程序都有好处。如果一个性能问题的根源是编译器部分一个差劲的选择,使用不同的选项或以别的编译器编译器目标模块也许能解决问题。

3.1.3.VTuneTM性能分析器

VTune使用性能监控硬件来收集你应用程序的统计数据与编码信息,以及它与微架构的交互。这允许软件工程师测量一个给定微架构工作负载的性能特征。VTune支持所有当前与以前的Intel处理器家族。

VTune性能分析器提供两种反馈:

·        由使用一个特定的编码建议或微架构特性所获得的性能提升的一个指示。

·        以一个特定的指标而言,程序中的一个改变提升还是恶化了性能的信息。

VTune性能分析器还提供若干工作负载特征的测量,包括:

·        作为一个工作负载中可获取指令级并行度指标的指令执行回收吞吐率。

·        作为缓存及内存层级一个重点指标的数据传输局部性。

·        作为一个数据访问时延分摊有效性指标的数据传输并行性。

注意
在机器一部分中提升性能不一定对总体性能带来显著提升。提升某个特定指标的性能,可能会降低总体性能。

在合适的地方,在本章中的编程建议包括对VTune性能分析器事件的结果,它提供了遵循建议所达成性能提升的可测量数据。更多如何使用VTune分析器,参考该应用程序的在线帮助。

3.2. CPU全景

许多编程建议从IntelCore微架构跨越到Haswell微架构都工作良好。不过,存在一个建议对一个微架构的好处超出其他微架构的情形。其中一些建议是:

·        指令解码吞吐率是重要的。另外,利用已解码ICache,循环流检测器(LoopStream Detector)以及宏融合可以进一步提升前端的性能。

·        生成利用4个解码器,并应用微融合与宏融合的代码,使3个简单解码器中的每个都不受限于处理包含一个微操作的简单指令。

·        在基于Sandy Bridge,IvyBridge及Haswell微架构的处理器上,最优前端性能的代码大小与已解码ICache相关。

·        寄存器部分写(partial register write)的依赖性可以导致不同程度的性能损失。要避免来自寄存器部分更新的伪依赖性(falsedependence),使用完整的寄存器更新及扩展移动。

·        使用合适的支持依赖性破除的指令(比如PXOR,SUB,XOR,XOPRS)。

·        硬件预取通常可以减少数据与指令访问的实际内存时延。不过不同的微架构可能要求某些定制的修改来适应每个微架构特定的硬件预取实现。

3.2.1.CPUID发布策略与兼容代码策略

当希望在所有处理器世代上有最优性能时,应用程序可以利用CPUID指令来识别处理器世代,将处理器特定的指令集成到源代码中。IntelC++编译器支持对不同的目标处理器集成不同版本的代码。在运行时执行哪些代码的选择在CPU识别符上做出。面向不同处理器世代的二进制码可以在程序员或编译器的控制下生成。

对面向多代微架构的应用程序,最小的二进制代码大小以及单代码路径是重要的,一个兼容代码策略是最好的。使用为IntelCore微架构开发,结合Intel微架构Nehalem的技术优化应用程序,当运行在基于当前或将来Intel64及IA-32世代的处理器上时,有可能提升代码效率与可扩展性。

3.2.2.透明缓存参数策略

如果CPUID指令支持功能页(functionleaf)4,也称为确定性缓存参数页,该页以一个确定性且前向兼容的方式报告缓存层级的每级缓存参数。该页覆盖Intel64与IA-32处理器家族。

对于依赖于一个缓存级特定参数的编程技术,使用确定性缓存参数允许软件以一个与未来Intel64及IA-32处理器世代前向兼容,且与缓存大小不同的处理器相互兼容的方式实现技术。

3.2.3.线程化策略与硬件多线程支持

Intel 64与IA-32处理器家族以两个形式提供硬件多线程支持:双核技术与HT技术。

为了完全发挥在当前及将来世代的Intel64与IA-32处理器中硬件多线程的性能潜力,软件必须在应用程序设计中拥抱一个线程化的做法。同时,为应付最大范围的已安装机器,多线程软件应该能够无故障地运行在没有硬件多线程支持的单处理器上,并且在单个逻辑处理器上达成的性能应该与非线程的实现可相比较(如果这样的比较可以进行)。这通常要求将一个多线程应用程序设计为最小化线程同步的开销。关于多线程的额外指引在第8章“多核与超线程技术”中讨论。

3.3. 编程规则,建议及调整提示

本节包括规则,建议与提示。它们面向的工程师是:

·        修改源代码来改进性能(user/source规则)。

·        编写汇编器或编译器(assembly/compiler规则)。

·        进行详细的性能调优(调优建议)。

编程建议使用两个尺度进行重要性分级:

·        局部影响(高,中或低)指一个建议对一个给定代码实例性能的影响。

·        普遍性(Generality)(高,中或低)衡量在所有应用程序领域里这些实例的发生次数。普遍性也可认为是“频率”。

这些建议是大概的。它们会依赖于编程风格,应用程序域,以及其他因素而变化。

高,中与低(H,M与L)属性的目的是给出,如果实现一个建议,可以预期的性能提升的相对程度。

因为预测应用程序中一段特定代码是不可能的,优先级提升不能直接与应用程序级性能提升相关。在观察到应用程序级性能提升的情形下,我们提供了该增益的一个定量描述(仅供参考)。在影响被认为不适用的情形下,不分配优先级。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: