多核多处理器架构软件设计的注意事项多核多处理器架构软件设计的注意事项
简介
计算硬件正在快速蓬勃发展。在时钟速度呈平稳状态的同时,晶体管密度在不断增长。处理器制造商希望通过让每个芯片拥有
多个核和硬件线程来提高多处理能力。例如,IBM POWER7? 对称多处理器架构通过每个核支持多达 4 个线程、每个芯片支
持 8 个核、每台服务器支持 32 个芯片插槽来实现高度并行性,总共 1024 个并发硬件线程。相比之下,IBM POWER6? 架构
仅支持每个核 2 个线程、每个芯片 2 个核、每台服务器 32 个芯片插槽,总共 128 个并行硬件线程。
开发软件时,目前设计人员需要考虑可能会部署软件的多处理器、多核架构。这是因为:
通过使用更多核、硬件线程、更高的内存,应用程序应该会更好地执行和更出色地伸缩性,并能满足不断增长的性能和效率需
求。
随着越来越多地使用多核、多处理器系统,软件设计注意事项现在应该考虑包含能够在这些计算资源之间有效地分发软件功能
的方法。
如果在设计的过程中没有考虑这些考虑事项,那么在多处理器、多核环境中运行应用程序可能会导致严重且不易发现的性能问
题。
本文将会简要介绍为多核、多处理器环境设计软件时的一些重要注意事项。
在芯片多线程、多核、多处理器架构上软件可伸缩性的阻碍
应用程序应该能够在多核、多处理器环境中更好地伸缩、更出色地执行。但是,如果应用程序设计的效率低下,则可能会在这
样的环境中执行得较差,但通过使用可用的计算资源可以更好地伸缩和更出色地执行。这个可伸缩性的一些重要阻碍可能是:
效率低下的并行化:单片应用程序或软件无法有效使用可用的计算资源。您需要将应用程序组织成并行任务。在传统的不支持
多线程的应用程序或软件中,我们会经常看到这个问题。这些应用程序在多核、多处理器、芯片多线程硬件上无法伸缩,并且
无法实现更好的吞吐量。线程太多可能会和线程太少一样,都不会产生好的结果。
串行瓶颈:在多个线程或进程之间共享数据结构的应用程序可能会有串行瓶颈。为了保持数据完整性,可能必须使用锁定和串
行化技术(例如,读取锁、读写锁、写入锁、自旋锁、互斥等)将这些共享数据结构的访问串行化。设计得效率低下的锁可能
会由于多个线程或进程之间的高度锁争用而导致串行瓶颈,从而尝试获取锁。这可能会潜在地降低应用程序或软件的性能。应
用程序的性能可能会随着核心或处理器数量的增加而降低。
对操作系统 (OS) 或运行时环境的过度依赖:您不能依赖操作系统、运行时环境或编译器来完成伸缩应用程序或软件所需的一
切操作。但是,编译器和运行时环境可以帮助提供一定的优化,您不能依赖它们解决所有可伸缩性问题。例如,不能依赖
Java? 虚拟机 (JVM) 通过自动并行来发现 Java 应用程序的最佳可伸缩的机会。
工作负载的不平衡可能是一个瓶颈:工作负载的不均匀分布可能导致无法有效地利用计算资源。您可能必须将较大的任务划分
成可以并行运行的较小的任务,还可能必须将串行算法更改为并行算法,以便提高性能和可伸缩性。
I/O 瓶颈:由于阻止磁盘输入/输出 (I/O) 或高网络延迟而导致的瓶颈可能会严重抑制应用程序的可伸缩性。
无效的内存管理:在多核平台上,因为有很多处理单元,因此纯计算可能非常廉价,并且主要内存可能也不是问题,因为它正
在变得越来越大。但是,内存带宽一直是一个瓶颈,因为所有处理器核心都贡献了一个通用的总线。无效的内存管理可能导致
一些难以检测到的性能问题,比如伪共享。
低处理器利用率可能会明确表明资源利用率未达到最佳值。为了了解性能问题,您需要评估一下应用程序是否具有太少或太多
的线程,是否有锁定或同步问题、网络或 I/O 延迟、内存抖动或其他内存管理问题。只要资源是花费在有意义的工作的应用程
序线程上,高处理器利用率通常都会不错。
芯片多线程 (CMT)、多核和多处理器 (MP) 系统概述
在讨论芯片多线程、多核、多处理器环境的设计注意事项之前,我们会简要介绍这类系统。图 1 所述的系统有两个处理器,
每个处理器有两个核心,并且每个核心有两个硬件线程。每个核心有一个 L1 缓存和一个 L2 缓存。因此,每个核心可能都拥
有自己的 L2 缓存,或者同一个处理器上的核心可能会共享 L2 缓存。同一个核上的硬件线程会共享 L1 和 L2 缓存。
图 1. 一个典型的芯片多线程、多核、多处理器系统