作者: Samuel Williams, Andrew Waterman, and David Patterson

A1 主要贡献

核心问题: 计算机体系结构从单核向多核的转变带来了设计上的多样性,例如,众多的简单处理器与少数复杂处理器、多线程技术的依赖程度、以及使用显式寻址的本地存储替代缓存等。这种设计多样性加剧了程序员、编译器编写者和架构师在优化和设计软件/硬件时面临的困难。目前缺乏一种易于理解、能提供性能指导的通用模型。

研究目标与创新点:
本文提出了一种名为 Roofline 的可视化性能模型,旨在为多核架构提供性能优化的洞见。该模型的目标是像缓存领域的3Cs模型(强制性、容量性、冲突性未命中)一样,虽不完美但富有洞察力,能够帮助相关人员改进其设计。

Roofline模型的主要创新点在于:
1. 关联核心性能指标: 它通过一个二维对数坐标图,直观地将处理器的浮点性能、内存性能和应用程序的运算强度(Operational Intensity)关联起来。运算强度被定义为“每字节DRAM流量所执行的运算次数”,衡量的是缓存过滤后的主存流量,这使得模型能包含计算机的内存优化效果。
2. 设定性能上界: 模型通过两条线——代表峰值计算性能的水平线和代表峰值内存带宽的斜线——共同构成一个“屋顶”(Roofline),为任何给定运算强度的核心程序(kernel)设定了性能的理论上界。这清晰地揭示了一个程序是计算受限(compute-bound)还是内存受限(memory-bound)
3. 指导优化路径: 模型引入了多层“性能天花板(Ceilings)”的概念。每个天花板代表一项具体的优化技术(如改善指令级并行、内存亲和性、软件预取等)。程序当前性能与不同天花板之间的差距,直观地展示了各项优化的潜在收益,从而为程序员指明了优化顺序和重点。
4. 提供架构洞见: 模型的“屋脊点(ridge point)”,即计算屋顶和内存屋顶的交点,其横坐标揭示了要达到计算机峰值性能所需的最小运算强度。这个点的位置反映了在该架构上实现峰值性能的难易程度,为计算机架构师的设计提供了重要参考。

该模型通过对四种不同的多核架构(Intel Xeon, AMD Opteron X4, IBM Cell, Sun T2+)和四个关键的浮点核心程序进行分析,验证了其有效性和实用性。

A3 背景知识与性能模型

  • 现有模型的局限性: 随机分析模型【索引4,The Landscape of Parallel Computing Research: A View from Berkeley+2006+Technical Report; 索引24,Analytic queueing network models for parallel processing of task systems+1986+IEEE Transactions on Computers】和统计性能模型【索引7,A hierarchical approach to modeling and improving the performance of scientific applications on the KSR 1+1994+International Conference on Parallel Processing; 索引25,A genetic algorithms approach to modeling the performance of memory-bound computations+2007+SC07 Conference】虽然能准确预测多处理器上的程序性能,但很少能提供如何改进程序、编译器和计算机性能的洞见【索引1,Analyzing the Behavior and Performance of Parallel Programs+1993+Ph.D. thesis】,并且对于非专家来说难以使用【索引25】。

  • 界限与瓶颈分析法: 作为一种更简单的替代方法,“界限与瓶颈分析(bound and bottleneck analysis)”不试图精确预测性能,而是“为影响计算机系统性能的主要因素提供有价值的洞见。特别是,它突出并量化了系统瓶颈的关键影响”【索引20,Quantitative System Performance: Computer System Analysis Using Queueing Network Models+1984+Prentice Hall】。

  • Amdahl定律: 性能界限中最著名的例子无疑是Amdahl定律【索引3,Validity of the single processor approach to achieving large-scale computing capabilities+1967+AFIPS Conference】,它指出并行计算机的性能增益受到并行程序串行部分的限制,最近该定律也被应用于异构多核计算机【索引4,The Landscape of Parallel Computing Research: A View from Berkeley+2006+Technical Report; 索引18,Amdahl’s Law in the multicore era+2008+IEEE Computer】。

A2 方法细节

Roofline 模型

  • 运算强度的定义: 在可预见的未来,片外内存带宽通常是系统性能的制约资源【索引23,Latency lags bandwidth+2004+Commun. ACM】。因此,我们需要一个能将处理器性能与片外内存流量联系起来的模型。为此,我们使用“运算强度(operational intensity)”一词,表示每字节DRAM流量所执行的运算次数。这里定义的总访问字节数,是指经过缓存层次结构过滤后到达主内存的字节数。也就是说,我们测量的是缓存与内存之间的流量,而不是处理器与缓存之间的流量。因此,运算强度可以预测一个核心程序在特定计算机上所需的DRAM带宽。

  • 术语选择的原因: 我们之所以使用“运算强度”而不是“算术强度(arithmetic intensity)”【索引16,Mapping computational concepts to GPUs+2005+ACM SIGGRAPH Courses】或“机器平衡(machine balance)”【索引8,Estimating interlock and improving balance for pipelined machines+1988+Journal of Parallel Distributed Computing; 索引9,Improving the ratio of memory operations to floating-point operations in loops+1994+ACM Transactions on Programming Languages and Systems】,原因有二:首先,“算术强度”和“机器平衡”衡量的是处理器与缓存之间的流量,而注重效率的程序员希望衡量缓存与DRAM之间的流量。这一微妙变化使他们能将计算机的内存优化效果纳入我们的界限与瓶颈模型中。其次,我们认为该模型也适用于非算术运算的核心程序(后文会讨论),因此需要一个比“算术”更通用的术语。

  • 模型构建: Roofline模型在一个二维对数坐标图中将浮点性能、运算强度和内存性能联系起来。峰值浮点性能可以通过硬件规格或微基准测试获得。我们在此考虑的核心程序的工作集不能完全放入片上缓存,因此峰值内存性能由缓存后的内存系统决定。虽然可以通过STREAM基准测试【索引22,STREAM: Sustainable Memory Bandwidth in High-Performance Computers+1995】获得内存性能,但在这项工作中,我们编写了一系列逐步优化的微基准测试,旨在确定可持续的DRAM带宽。这些测试包含了所有获取最佳内存性能的技术,包括预取和数据对齐。(关于如何测量处理器和内存性能以及运算强度的更多细节,请参见在线附录A.1)。

    图1:(a) AMD Opteron X2 和 (b) Opteron X2 与 Opteron X4 的 Roofline 模型。
    图1:(a) AMD Opteron X2 和 (b) Opteron X2 与 Opteron X4 的 Roofline 模型。

  • 模型图示说明: 图1a展示了在一台双插槽系统中的2.2GHz AMD Opteron X2 model 2214的模型。该图为对数-对数坐标。y轴是可达到的浮点性能,x轴是运算强度,范围从0.25 Flops/DRAM字节-访问到16 Flops/DRAM字节-访问。被建模的系统根据我们的基准测试,其峰值双精度浮点性能为17.6 GFlops/s,峰值内存带宽为15GB/s。后一个指标是计算机内存的稳态带宽潜力,而不是DRAM芯片的引脚带宽。

  • 性能边界的绘制: 我们可以绘制一条水平线来表示计算机的峰值浮点性能。一个浮点核心程序的实际浮点性能不能高于这条水平线,因为这条线是硬件极限。内存峰值性能可以绘制成一条斜率为1的直线,因为x轴单位是Flops/Byte,y轴单位是GFlops/s,所以GB/s(即(GFlops/s)/(Flops/Byte))就是一条单位斜率的线。因此,我们可以绘制第二条线,它界定了计算机内存系统在给定运算强度下所能支持的最大浮点性能。以下公式驱动了图1a中的两个性能极限:

    公式
    公式

    这两条线在峰值计算性能和峰值内存带宽的点上相交。请注意,这些极限是为每台多核计算机创建一次,而不是为每个核心程序创建一次。

  • 模型的使用方法: 对于一个给定的核心程序,我们可以根据其运算强度在x轴上找到一个点。如果我们通过该点画一条垂直线(图中的粉色虚线),那么该核心程序在这台计算机上的性能必定位于这条线上的某处。

  • 模型命名与核心概念: 水平线和对角线赋予了这个界限模型它的名字。Roofline模型根据核心程序的运算强度为其性能设定了一个上限。如果我们把运算强度想象成一根撞向屋顶的柱子,它要么撞到屋顶的平坦部分,意味着性能是计算受限的;要么撞到倾斜部分,意味着性能最终是内存受限的。在图1a中,一个运算强度为2.0 Flops/Byte的核心程序是计算受限的,而一个运算强度为1.0 Flops/Byte的核心程序是内存受限的。给定一个Roofline图,你可以重复地将其应用于不同的核心程序,因为Roofline本身不会改变。

  • 屋脊点的意义: 屋脊点(ridge point),即对角线屋顶和水平屋顶相交的点,为了解计算机的整体性能提供了洞见。屋脊点的x坐标是实现最大性能所需的最小运算强度。如果屋脊点非常靠右,那么只有运算强度非常高的核心程序才能达到该计算机的最大性能。如果它非常靠左,那么几乎任何核心程序都有可能达到最大性能。正如我们稍后解释的,屋脊点揭示了程序员和编译器编写者实现峰值性能的难度级别。

  • 模型应用示例: 为了说明这一点,我们将图1a中的双核Opteron X2与其后继者四核Opteron X4进行比较。为了简化主板设计,它们共享相同的插槽。因此,它们拥有相同的DRAM通道,从而可以有相同的峰值内存带宽,尽管X4的预取功能更好。除了核心数量翻倍外,X4每个核心的峰值浮点性能也翻了一番;X4核心每个时钟周期可以发出两条浮点SSE2指令,而X2核心每两个时钟周期可以发出两条指令。由于时钟频率略快——X2为2.2GHz,X4为2.3GHz——X4能够以相同的内存带宽实现略高于X2四倍的峰值浮点性能。图1b比较了这两个系统的Roofline模型。正如预期的那样,屋脊点从Opteron X2的1.0 Flops/Byte向右移动到Opteron X4的4.4。因此,要在X4上实现性能提升,核心程序的运算强度需要大于1.0 Flops/Byte。

为模型添加性能天花板

  • 引入性能天花板: Roofline模型提供了一个性能上限。假设一个程序的性能远低于其Roofline,应该实施哪些优化,以及按什么顺序进行?界限与瓶颈分析的另一个优点是,“可以同时处理多个备选方案,单一的界限分析能为所有方案提供有用的信息”【索引20,Quantitative System Performance: Computer System Analysis Using Queueing Network Models+1984+Prentice Hall】。我们利用这一思想,在Roofline模型中添加多个天花板,以指导优化选择。这类似于循环平衡为编译器提供指导。我们可以将每个优化视为相应Roofline下的一个“性能天花板”,这意味着不首先执行相关优化就无法突破该天花板。

  • 计算瓶颈的优化: 例如,为了减少Opteron X2上的计算瓶颈,几乎任何核心程序都可以通过两种优化得到帮助:

    1. 提升指令级并行(ILP)和应用SIMD: 对于超标量架构,最高性能来自于每个时钟周期取指、执行和提交最大数量的指令。目标是改进编译器生成的代码以增加ILP。最高性能来自于完全掩盖功能单元的延迟。一种隐藏指令延迟的方法是循环展开。对于基于x86的架构,另一种方法是尽可能使用浮点SIMD指令,因为一条SIMD指令可以对一对相邻的操作数进行操作。
    2. 平衡浮点操作组合: 最佳性能要求指令组合中有很大一部分是浮点操作(稍后讨论)。峰值浮点性能通常还要求同时有相等数量的浮点加法和乘法,因为许多计算机具有乘加指令或相等数量的加法器和乘法器。
      图2:带有性能天花板的 Opteron X2 Roofline 模型。
      图2:带有性能天花板的 Opteron X2 Roofline 模型。

      图片
      图片
  • 内存瓶颈的优化: 内存瓶颈可以通过三种优化来减少:

    1. 为单位步长访问重构循环: 优化为单位步长内存访问可以激活硬件预取,从而显著增加内存带宽。
    2. 确保内存亲和性: 当今大多数微处理器都将内存控制器集成在芯片上。如果系统有两个多核芯片,那么一些地址会访问一个多核芯片本地的DRAM,其余的则通过芯片互连访问另一个芯片本地的DRAM。后者会降低性能。这项优化将数据和负责处理该数据的线程分配到同一个内存-处理器对上,这样处理器就很少需要访问连接到其他芯片的内存。
    3. 使用软件预取: 最高性能通常需要保持许多内存操作在进行中,通过预取比等到程序实际请求数据时更容易实现这一点。在某些计算机上,软件预取比单独的硬件预取能提供更多的带宽。
  • 天花板的测量: 与计算Roofline一样,计算天花板可以来自优化手册【索引2,Software Optimization Guide for AMD Family 10h Processors+2008】,但也很容易想象通过简单的微基准测试来收集必要的参数。内存天花板需要对每台计算机进行实验以确定它们之间的差距(见在线附录A.1)。好消息是,与Roofline一样,天花板也只需为每台多核计算机测量一次。

  • 天花板模型图示: 图2在图1a的Roofline模型中加入了天花板;图2a显示了计算天花板,图2b显示了内存带宽天花板。虽然较高的天花板没有标记较低的优化,但这些较低的优化是隐含的;要突破一个天 ઉ板,程序员必须已经突破了其下方的所有天花板。图2a显示了如果浮点操作组合不平衡,计算“天花板”为8.8 GFlops/s;如果也缺少增加ILP或SIMD的优化,则为2.2 GFlops/s。图2b显示了没有软件预取时内存带宽天花板为11 GB/s,没有内存亲和性优化时为4.8 GB/s,仅有单位步长优化时为2.7 GB/s。

  • 组合模型与优化区域: 图2c将图2a和2b合并成一张图。核心程序的运算强度决定了优化区域,从而决定了应该尝试哪些优化。图2c中部显示计算优化和内存带宽优化是重叠的;我们选择颜色来突出这种重叠。例如,核心程序2落在右侧的蓝色梯形区域,表明程序员应只关注计算优化。如果一个核心程序落在左下角的黄色三角形区域,模型会建议只尝试内存优化。核心程序1落在中间的绿色(=黄色+蓝色)平行四边形区域,表明程序员应尝试两种类型的优化。注意,核心程序1的垂直线位于浮点不平衡优化之下,因此优化2可以跳过。

    表1:四款近期多核计算机的特性。
    表1:四款近期多核计算机的特性。

  • 天花板的潜在收益: Roofline模型的天花板建议程序员应该执行哪些优化。一个天花板与下一个更高天花板之间的差距高度,代表了尝试这项优化的潜在回报。因此,图2表明,优化1(提升ILP/SIMD)对于在该计算机上优化计算具有巨大的潜在收益,而优化4(改善内存亲和性)对于在该计算机上改善内存带宽具有巨大的潜在收益。

  • 天花板的排序: 天花板的顺序建议了优化的顺序,因此我们从下到上对天花板进行排序;最可能由编译器实现或程序员花费少量努力就能实现的位于底部,而程序员难以实现或核心程序固有缺乏的位于顶部。一个特殊的天花板是浮点平衡,因为实际的组合取决于核心程序。对于大多数核心程序来说,实现乘法和加法的均等是困难的,但对于少数核心程序来说,均等是自然的。一个例子是稀疏矩阵向量乘法;对于这个领域,我们会将浮点组合作为最低的天花板,因为它是固有的。与3Cs模型一样,只要Roofline模型能提供洞见,它就不必是完美的。

将3Cs模型与运算强度关联

  • 运算强度的可变性: 运算强度告诉程序员哪些天花板最需要关注。到目前为止,我们假设运算强度是固定的,但这并非总是如此;例如,对于某些核心程序,运算强度会随着问题规模的增加而增加(例如密集矩阵和FFT问题)。

  • 缓存优化与运算强度: 缓存会过滤掉进入内存的访问次数,因此改善缓存性能的优化会增加运算强度。这样,我们可以将3Cs模型与Roofline模型耦合起来。强制性未命中(Compulsory misses)设定了最小的内存流量,因此也设定了可能达到的最高运算强度。由冲突(conflict)和容量(capacity)未命中产生的内存流量会显著降低核心程序的运算强度,因此我们应设法消除这类未命中。

  • 提升运算强度的示例: 例如,我们可以通过填充数组来改变缓存行寻址,从而减少冲突未命中带来的流量。第二个例子是,一些计算机有非分配写指令(non-allocating store),因此写操作直接进入内存,不影响缓存。这种方法避免了加载一个将被覆写的数据块到缓存中,从而减少了内存流量。它还防止了用不会被读取的数据替换掉缓存中有用的项,从而节省了冲突未命中。

  • 优化顺序的建议: 这种将运算强度向右移动的效应,可能会使一个核心程序进入不同的优化区域。通常,我们建议在实施其他优化之前,先提高核心程序的运算强度。

A4 实验环境

  • 硬件配置: 实验在四台不同的双插槽多核计算机上进行,其关键特性如表1所示。

    • Intel Xeon (Clovertown): 2.33GHz,2x4核,每核32KB L1缓存,每4核共享4MB L2缓存。采用前端总线(FSB)连接到北桥和内存控制器。
    • AMD Opteron X4: 2.3GHz,2x4核,每核64KB L1和512KB L2缓存,每芯片共享2MB L3缓存。内存控制器集成在芯片上。
    • Sun UltraSPARC T2+: 1.2GHz,2x8核,每核8KB L1缓存,每芯片共享4MB L2缓存。支持高度多线程(每核8个硬件线程),内存带宽最高。
    • IBM Cell QS20: 3.2GHz,异构设计,包含1个PowerPC核心(PPE)和8个协同处理元件(SPE)。每个SPE有256KB的本地存储(local memory)而非缓存。
  • 核心程序(数据集): 选用了Phil Colella确定的“七个矮人”中的四个浮点核心程序,它们被认为在未来十年对科学和工程计算至关重要。这些程序具有足够的并行性以利用所有核心和线程。特性如表2所示。

    • 稀疏矩阵向量乘法 (SpMV): 计算 y = A*x,其中 A 是稀疏矩阵。运算强度低,内存访问不规则。
    • 格子-玻尔兹曼磁流体动力学 (LBMHD): 数据结构复杂,内存访问模式不规则。
    • 模板计算 (Stencil): 在一个256³的3D网格上进行计算,每个点的更新依赖于其邻居。
    • 3D 快速傅里叶变换 (3D FFT): 经典的“分治”算法,在128³和512³点的数据集上进行测试,其运算强度随问题规模变化。
      表2:四个浮点核心程序的特性。
      表2:四个浮点核心程序的特性。
  • 软件配置:

    • 代码实现: 核心程序的优化版本由自动调优器(autotuners)生成,代码来源为【索引12,Stencil computation optimization and autotuning on state-of-the-art multicore architectures+2008+SC08 Conference; 索引28,Lattice Boltzmann simulation optimization on leading multicore platforms+2008+IEEE International Symposium on Parallel and Distributed Processing Symposium; 索引29,Optimization of sparse matrix-vector multiplication on emerging multicore platforms+2007+SC07 Conference】。
    • 依赖库: 在Xeon、X4和T2+上,3D FFT使用了自动调优库FFTW【索引15,The design and implementation of FFT W3+2005+Proceedings of the IEEE】。
    • 语言与编译器: 代码为C语言,为了在x86平台上获得良好性能,代码中大量使用了SIMD指令的内在函数(intrinsics)。

A4 实验结果

本节展示了在四种多核架构上运行四个核心程序的Roofline模型分析和结果。

  • 各平台Roofline模型分析:

    • Intel Xeon (图3a, 3d): 具有最高的峰值双精度性能,但其屋脊点非常靠右(6.7 Flops/Byte),这意味着需要极高的运算强度才能达到峰值性能。这部分是由于前端总线的限制。
    • AMD Opteron X4 (图3b, 3e): 由于集成了内存控制器,其屋脊点(4.4 Flops/Byte)比Xeon更靠左,更容易发挥性能。
    • Sun UltraSPARC T2+ (图4): 拥有最高的内存带宽,导致其屋脊点非常靠左(0.33 Flops/Byte),使得大多数核心程序都能轻易达到计算性能瓶颈。
    • IBM Cell (图3c, 3f): 屋脊点同样很低(0.65 Flops/Byte)。
    • 模型调整: 由于SpMV核心程序天然具有乘加平衡的特性,而其他三个核心程序难以实现,因此为每个平台绘制了两套Roofline图:一套将乘加平衡作为顶层天花板(用于LBMHD, Stencil, 3D FFT),另一套将其作为底层天花板(用于SpMV)。T2+因硬件结构不同,只有一个Roofline图。
      图3a–3c:Intel Xeon、AMD Opteron X4 和 IBM Cell 的 Roofline 模型。
      图3a–3c:Intel Xeon、AMD Opteron X4 和 IBM Cell 的 Roofline 模型。

      图片
      图片
  • 核心程序性能分析:

    • SpMV: 运算强度极低(<0.25 Flops/Byte),远低于所有平台的屋脊点,因此性能完全由内存系统决定。优化重点是表3中列出的内存相关技术。
    • LBMHD: 运算强度(0.70-1.07 Flops/Byte)较高,在大多数平台上同时需要计算和内存优化。但在T2+上,由于其屋脊点极低,该程序变为计算受限,仅需计算优化即可达到性能天花板。
    • Stencil: 运算强度为0.33 Flops/Byte。
    • 3D FFT: 运算强度随问题规模变化(1.09-1.64 Flops/Byte)。其性能在Xeon和X4上是内存受限,但在T2+和Cell上是计算受限。
      图3d–3f:Intel Xeon、AMD Opteron X4 和 IBM Cell 的 Roofline 模型。
      图3d–3f:Intel Xeon、AMD Opteron X4 和 IBM Cell 的 Roofline 模型。

      图片
      图片

      图片
      图片

      图4:Sun UltraSPARC T2+ 的 Roofline 模型。
      图4:Sun UltraSPARC T2+ 的 Roofline 模型。
  • 编程生产力与性能:

    • T2+ (屋脊点最低) 编程最容易。其优化策略简单:从编译器获取高性能代码,然后使用尽可能多的线程。
    • Xeon (屋脊点最高) 编程最困难。其内存行为复杂,且需要手动编写SIMD内在函数才能获得良好性能。
    • Opteron X4 的编程工作量与Xeon相当。
    • IBM Cell (屋脊点低) 编程面临两类挑战:一是编译器对SPE的SIMD指令支持不成熟,需要手动插入内在函数;二是没有缓存,需要通过DMA在本地存储和主存之间显式传输数据,但DMA比缓存预取更容易编程和实现高性能。
  • 模型验证: 表4总结了每个核心程序-计算机组合的性能。结果显示,在所有16个组合中,实际性能都位于Roofline模型预测的上下天花板之间,验证了该界限与瓶颈模型的有效性。性能瓶颈(内存或计算)也被明确指出:在Xeon和X4上,16个天花板中有15个是内存受限;而在T2+和Cell上,瓶颈几乎是均等分布的。

A7 补充细节:关于Roofline的谬误辨析

  • 谬误:模型未考虑缓存和预取等现代处理器特性。
    事实:模型确实考虑了这些特性。运算强度的定义是基于缓存与内存之间的流量,而非处理器与缓存之间,这已经包含了缓存的过滤效应。此外,用于确定内存性能屋顶的基准测试包含了预取和其他所有能提升内存性能的优化。

  • 谬误:将缓存大小加倍会增加运算强度。
    事实:仅当程序存在容量或冲突未命中时,增加缓存大小才有帮助。对于经过自动调优、内存访问已接近强制性未命中的核心程序,更大的缓存对其运算强度没有影响。一个例外是128³的3D FFT,更大的缓存可以容纳一个完整的3D数据平面,从而通过减少容量和冲突未命中来提高运算强度。

  • 谬误:模型没有考虑长内存延迟。
    事实:模型中的“无软件预取”天花板之所以处于较低的内存带宽高,正是因为它无法隐藏长内存延迟。

  • 谬误:模型忽略了浮点程序中的整数单元,这可能限制性能。
    事实:整数代码和整数性能确实会影响性能。例如,Sun T2+在指令发射带宽中有较大比例用于整数指令,且执行速率较低,这影响了其整体性能。

  • 谬误:模型与多核无关。
    事实:根据利特尔定律(Little's Law)【索引17,Computer Architecture: A Quantitative Approach, Fourth Edition+2007; 索引20; 索引21,A proof of the queueing formula L = λ W+1961+Operations Research】,需要相当大的并发性才能真正挑战内存系统的极限。这种并发性在多核处理器上比在单核处理器上更容易满足。因此,Roofline模型的带宽导向特性对多核系统尤其有帮助。

  • 谬误:需要为每个核心程序重新计算Roofline模型。
    事实:Roofline模型只需为给定的性能指标和计算机计算一次。之后,它可以指导任何以该指标为关键性能指标的程序的实现。天花板也是测量一次,但可以根据核心程序的特性(如乘法和加法是否自然平衡)重新排序。

  • 谬愈:模型仅限于那些容易优化且从不命中缓存的核心程序。
    事实:这些核心程序确实会命中缓存;例如,Stencil的缓存命中率至少为94%,FFT至少为98%。而且,在这些多样化的多核架构上创建这些数值方法的最高速版本并不容易。

  • 谬误:模型仅限于浮点程序。
    事实:模型可以推广到其他性能指标。一个具体的例子是3D FFT的转置阶段,它完全不执行浮点运算。图5展示了在Cell上仅针对此阶段的Roofline模型,其中用“交换次数”替代了“浮点运算次数”。

    图5:Cell 上 3D FFT 转置阶段的 Roofline 模型。
    图5:Cell 上 3D FFT 转置阶段的 Roofline 模型。

  • 谬误:Roofline模型必须使用DRAM带宽。
    事实:如果工作集能装入L2缓存,那么对角线的Roofline可以是L2缓存带宽,x轴的运算强度则基于每L2缓存字节访问的浮点运算次数。例如,Jike Chong【索引10,Private communication on financial PDE solvers+2008】的工作就使用Roofline模型来追踪L1、L2和DRAM的带宽,以指导金融偏微分方程求解器的算法改进。

A5 结论

本文提出的Roofline模型是一个简单、可视化的计算模型,旨在帮助程序员和架构师应对从串行计算到并行计算转变所带来的计算机多样性。该模型通过关联处理器性能、内存带宽和程序的运算强度,帮助识别系统与核心程序的匹配度,并指导代码或硬件的优化方向。

通过将模型应用于四种不同的多核设计(AMD Opteron X4, Intel Xeon, IBM Cell, Sun T2+)和四个“七个矮人”中的核心程序,我们发现:
1. 屋脊点是关键指标: 屋脊点——达到最大性能所需的最小运算强度——比时钟频率或峰值性能更能预测实际性能和编程难度。
2. 性能与易用性的权衡: IBM Cell在这些核心程序上获得了最高的实测性能(GFlops/s),但Sun T2+(其Roofline模型的屋脊点最低)却是最容易实现其最高性能的计算机。
3. 对架构设计的启示: 实验中的两款x86计算机的屋脊点很高(4.4和6.7 Flops/Byte),而核心程序的运算强度中位数仅为0.60 Flops/Byte,这表明计算机设计存在不平衡。架构师在设计新系统时应考虑降低屋脊点,以使程序更容易达到峰值性能。

未来工作展望:
Roofline模型与性能计数器之间可能存在协同关系,自动创建Roofline模型的需求可以指导性能计数器的设计。此外,该模型的应用范围可以扩展到其他类型的多核系统(如GPU、向量处理器)、其他核心程序(如排序、光线追踪)、其他计算指标(如每秒排序对数、每秒帧数)以及其他流量指标(如L3缓存带宽、I/O带宽)。作者邀请更多研究者共同探索Roofline模型的有效性。

方法细节中的引用汇总

在论文的方法论、模型展示和实验分析部分,作者引用了多篇文献来支撑其方法和结论。以下是关键引用的汇总:

  • 引用段落: "Adding Ceilings to the Model" 章节,描述计算天花板的来源。

    • 引用描述: 提到计算天花板可以来自优化手册。
    • 参考文献: 【2】Software Optimization Guide for AMD Family 10h Processors, Publication 40546, Apr. 2008; www.amd.com/us-en/assets/content_type/white_papers_ and_tech_docs/40546.pdf.
  • 引用段落: "Demonstrating the Model" 章节,介绍用于实验的四个核心程序的优化代码来源。

    • 引用描述: 指出所用的自动调优器代码来自三篇主要会议论文。
    • 参考文献:
      • 【12】Datta, K., et al. Stencil computation optimization and autotuning on state-of-the-art multicore architectures. SC08 Conference, 2008.
      • 【28】Williams, S., et al. Lattice Boltzmann simulation optimization on leading multicore platforms. IEEE International Symposium on Parallel and Distributed Processing Symposium, 2008.
      • 【29】Williams, S., et al. Optimization of sparse matrix-vector multiplication on emerging multicore platforms. SC07 Conference, 2007.
  • 引用段落: "Demonstrating the Model" 章节,描述3D FFT的实现方式。

    • 引用描述: 指出在Xeon, X4, 和 T2+上使用了自动调优库FFTW。
    • 参考文献: 【15】Frigo, M. and Johnson, S. The design and implementation of FFT W3. Proceedings of the IEEE, 2005.
  • 引用段落: "Demonstrating the Model" 章节,讨论SpMV核心程序的运算强度。

    • 引用描述: 提到SpMV的运算强度在经过寄存器分块优化后从0.17 Flops/Byte提升到0.25 Flops/Byte。
    • 参考文献: 【26】Vuduc, R., et al. Performance optimizations and bounds for sparse matrix-vector multiply. SC02 Conference, 2002.
  • 引用段落: "Fallacies About Roofline" 章节,举例说明Roofline模型可以用于L1/L2缓存带宽。

    • 引用描述: 引用了Jike Chong的私人通信,他将Roofline模型应用于金融偏微分方程求解器,并分析了L1、L2和DRAM的带宽。
    • 参考文献: 【10】Chong, J. Private communication on financial PDE solvers, 2008.