Intel64及IA-32架构优化指南第8章多核与超线程技术——8.3 优化准则
8.3 优化准则
本小节概括了调整多线程应用程序的优化准则。下面列出了五个领域(以重要次序排列):
● 线程同步
● 总线利用
● 存储器优化
● 前端优化
● 执行资源优化
本小节列出了与每个领域相关联的实践。后面小节会更深入地讨论每个领域的准则。
大部分的编程建议都可提升利用多处理器核心以及HT技术的性能。仅用于单一环境的技术没有被提起。
8.3.1 线程同步的关键实践
最小化线程同步成本的关键实践概括为以下几条:
● 在快速旋转循环中插入PAUSE指令并将循环重复次数保持最小来提升整个系统性能。
● 用流水化的锁来代替一个可能被多个线程所获得的旋锁,这样不会有超过两个线程对一个锁具有写访问。如果只有一个线程需要写一个由两个线程所共享的变量,那么就不需要锁。
● 在一个长的闲置循环中使用线程阻塞API来释放处理器。
● 防止两个线程之间的每个线程数据的“错误共享”。
● 单独放置每个同步变量,以独立的128字节放置或在独立的Cache行中放置。
8.3.2 系统总线优化的关键实践
管理总线交通能极大地影响多线程软件和MP系统的整体性能。为达成高数据吞吐和快速响应的系统总线优化的关键实践有:
● 提升数据和代码位置来恒定总线命令带宽。
● 避免软件预取指令的过度使用并允许自动的硬件预取器起作用。软件预取的过多使用会极大地且不必要地增加总线使用,如果不适当地使用的话。
● 考虑使用叠交的多个背靠背的存储器读来减少有效的Cache失败延迟。
● 使用完整的写事务来达成更高的数据吞吐。
8.3.3 存储器优化的关键实践
优化存储器操作的关键实践在以下概述:
● 使用Cache分块来提升数据访问的位置。当目标处理器支持HT技术时目标定为Cache大小的四分之一或二分之一。
● 最小化执行在不同物理处理器上的线程之间的数据共享,这些物理处理器共享一个公共的总线。
● 最小化每个线程中64K字节倍数的偏移的数据访问模式。
● 调整一个应用程序中每个线程的私有栈大小,使得这些栈之间的空白不为64K字节的倍数或1M字节倍数的偏移(防止不必要的Cache行逐出),当目标处理器支持HT技术时。
● 当同一个应用程序的两个实例以锁步执行时,添加一个每个实例的栈偏移来避免存储器访问是64K字节或1M字节的倍数,当目标处理器支持HT技术时。
8.3.4 前端优化的关键实践
在支持HT技术的处理器上的前端优化的关键实践有:
● 避免过度的循环展开以确保踪迹Cache高效操作。
● 优化代码尺寸以提升踪迹Cache的本地性并增加所给予的追踪长度。
8.3.5 执行资源优化的关键实践
每个物理处理器具有专用的执行资源。支持HT技术的物理处理器中的逻辑处理器共享特定的片上执行资源。执行资源的优化的关键实践包括:
● 优化每个线程,先实现最优的频率调整。
● 优化多线程应用来实现与物理处理器个数相关的最优调整。
● 如果两个线程共享同一物理处理器包的执行资源,那么可互操作地使用片上执行资源。
● 对于每个支持HT技术的处理器,考虑在功能上添加非协作的线程以增加每个物理处理器包内的硬件资源的利用。
8.3.6 通用性与性能影响
接下去的五小节涵盖了详细的优化技术。在每个小节中所讨论的建议以所估计的局部影响和通用性上的重要性来划分等级。
等级划分是主观的且是大约估计的。它们根据编程风格、应用程序和线程域而有所不同。每个建议包含高、中、低的影响等级的目的是为了提供一个相对的指示,说明当实现一个建议时能被期望的性能增益的程度。
跨许多应用程序来预测一个代码实例的可能性是不太可能的,因此一个影响等级划分无法直接与应用层的性能增益发生关系。通用性的等级划分也是主观和大概的。
并不影响所有三种衡量因素的编程建议一般分类为中或低。