📖 模块十一:官方教材精讲《摩尔线程GPU架构与编程实践》

第9章精讲:性能分析工具(musa-profiler / Roofline / 时间线归因)

高级·⏱ 85分钟·📅 2026-07-30
📌
本课定位
本课精讲《摩尔线程GPU架构与编程实践》第 9 章——MUSA 性能分析工具。前面章节教会你"怎么写 Kernel、怎么调优内存与占用率",本章解决的是更根本的问题:在动手优化之前,怎么知道该优化哪里。全章围绕摩尔线程官方性能分析套件 Moore Perf Tools 的两大组件——面向系统级宏观定位的 Moore Perf System(CLI 工具 msys)与面向核函数级微观剖析的 Moore Perf Compute(CLI 工具 mcu)——建立一套"先宏观、后微观"的自上而下分析方法论。读完本课,你应该能独立完成一次从"发现热点 Kernel"到"判定其是计算受限还是内存受限"再到"验证优化效果"的完整闭环。

一、为什么需要专业性能分析工具

随着 MUSA 应用场景从简单并行计算扩展到深度学习推理、大规模矩阵运算等复杂场景,仅靠代码逻辑推导已经很难精准定位诸如 GPU 利用率低、内存传输耗时过长、核函数执行效率低下等性能瓶颈。这正是 Moore Perf Tools 存在的意义:为开发者提供软硬件活动的可见性,辅助分析应用程序、定位性能瓶颈、进而提升软件性能。该套件适用于多种图形与计算场景,本课聚焦其在 MUSA 开发中的应用。

1.1 自上而下的分析工作流

当开发中遇到性能问题时,推荐的标准流程是:

开始 → Moore Perf System 识别可疑 Kernel → 进一步分析 → Moore Perf Compute 定位问题点 → 修复并重新检查整体性能 → (循环回到开始)

对于简单场景,单次分析流程也许就能解决问题;对于复杂场景,则可能需要迭代多次。熟悉 Moore Perf Tools 且经验丰富的开发者,也可以根据具体问题直接选用合适的工具高效定位问题。这个"先粗后细"的顺序不是随意规定的:如果跳过 System 直接对全部 Kernel 做 Compute 级分析,在包含成百上千个 Kernel 的真实应用里,工作量会指数级增长,效率远低于先用 System 圈定嫌疑范围。

1.2 安装方式

可通过访问摩尔线程官网的 Moore Perf Tools 主页获取安装包,分别选择 Moore Perf System / Moore Perf Compute 后进入下载页面,按运行环境选择对应安装包。

环境安装方式说明
Linux(Ubuntu).deb 包 + dpkg 命令安装目前仅提供 Ubuntu 发行版的 .deb 包;以 Moore Perf System 1.4.0 为例,默认安装至 /opt/moore-threads/moore-perf-system/ 目录下
Windows.exe 图形化安装向导双击运行安装包,按界面提示完成操作即可
⚠️
前置条件与非 Ubuntu 发行版提示
成功安装 Moore Perf Tools 之后,还需要确保系统已正确安装运行 MUSA 应用程序所需的 GPU 驱动和其他 SDK 库——这是 MUSA 应用程序能够正常运行的基础,也是本套工具能采集到有效数据的前提。另外,教材原文只提到 Linux 环境目前仅提供 Ubuntu 的 .deb 包,对于非 Ubuntu 发行版(如 CentOS、openEuler)的适配方式教材并未展开说明,本课不做猜测性补充,如需在其他发行版上使用,请以官网当前的兼容性列表为准。

二、Moore Perf System:系统级性能跟踪

Moore Perf System 支持系统级的性能跟踪与指标监控。用户可按需配置系统级活动事件和指标,包括 API 调用、GPU 利用率以及内存等,并以时间线的形式查看,从而了解程序运行过程中的潜在关联、数据在系统中如何移动、任务如何并行化,进而对应用程序进行优化。它提供 GUI(图形用户界面)与 CLI(命令行界面)两种分析方式,用户可根据场景自行选择;教材示例选用 CLI 工具 msys,在配置了 8 个 MTT S5000 GPU 的服务器上对 llama3 8B 模型做分析。

2.1 CLI 采集命令

在服务器上执行以下命令,启动模型并收集 MUSA 和 GPU Metrics 信息、生成报告:

msys -t musa -gpu-metrics-set=0 -o S5000-10.116.36.72-llama3_8B-2025-05-22+step1

参数说明:

  • -t musa:指定收集 MUSA 信息;
  • -gpu-metrics-set=0:指定收集 GPU Metrics 信息;
  • -o <文件名>:指定报告文件名称或路径。

更详细的参数说明可在官网查阅 Moore Perf System 用户手册,或执行 msys -h 查看帮助信息。

2.2 GUI 时间线视图:逐步展开分析

用 Moore Perf System 提供的 GUI 程序打开生成的报告,切换到时间线视图:横轴代表时间,纵轴代表事件类型,以树的形式展示各类事件之间的关系。可展开的层级结构大致包含 Processes and threads(进程与线程)、Kernel and memory transfer(核函数与内存传输)、Multi-Stream(多流)、MUSA API calls(MUSA API 调用)、Memory utilisation(内存利用率)、Multi-GPU(多 GPU)。

Step-by-Step:从报告到"热点 Kernel"

  1. 展开 GPU 节点,查看 GPU Metrics 信息,包括温度(Temperature)、GPU 时钟(GPU Clock)、GPU 显存使用(GPU Memory Usage)、GPU 功耗使用(GPU Power Usage)。
  2. 展开 Processes 下的 MUSA HW 节点,查看 MUSA API 调用、Kernel 执行情况、Memory 操作情况。
  3. 放大视图看细节:默认视图数据过于密集,不利于观察真实执行情况。按住 Ctrl 键、滚动鼠标滚轮即可放大。
  4. 观察"空泡"现象:放大后通常会看到 GPU 上内存传输和 Kernel 执行重复出现,且大量时间被耗费在执行 Kernel 上、内存传输很少;但在一些重复活动之间会存在一段"空泡"(GPU 空闲间隙)。定位造成空泡的 CPU 侧原因、进而提升 GPU 利用率,是关键优化目标之一。
  5. 区域选择与右键菜单:进一步放大后选中一块区域并右键,可选择 Zoom into Selection(放大选择区域)、Go to New Timeline(在新时间线中打开选择区域),菜单中还包含 Add/Clear Measuring Line、Undo Zoom(快捷键 Backspace)、Reset Zoom(快捷键 Ctrl+H)等辅助操作。
  6. Events View 定位热点:选中 "All Streams" 右键选择 "Show in Events View",该节点下的所有活动都会展示在下方 Events List 中;单击 "Duration" 列按时间降序排列,即可找到"热点" Kernel(教材示例中约耗费 15 ms)。双击该 Kernel,会在时间轴上以蓝色突出显示与之相关的所有事件。
  7. 衔接 Moore Perf Compute:定位到热点 Kernel 后,用 Moore Perf Compute 对该 Kernel 做进一步的微观分析——这是第三节的内容。
💡
"空泡"不是 Kernel 的问题,往往是 CPU 侧调度的问题
"热点" Kernel 提示存在可优化空间——通过优化 Kernel、减少其执行时间可以提升 GPU 利用率;而消除时间轴上的"空泡",则能确保任务在 CPU 和 GPU 上分配的合理性。这两者是两类不同的优化方向:前者是"让 GPU 干活更快",后者是"让 GPU 别停着等"。不要把两者混为一谈——空泡现象通常源于 CPU 侧数据准备、调度或同步等待,仅优化 Kernel 本身无法解决,必须结合时间线上的 CPU 线程活动一起排查。

2.3 本节要点小结

维度Moore Perf System 提供的能力
分析层级系统级(宏观)
呈现形式时间线视图(GUI)/ 报告文件(CLI)
关键指标CPU 线程活动、GPU 利用率、内存传输、MUSA API 调用、GPU 温度/时钟/显存/功耗
典型发现GPU "空泡"(空闲间隙)、热点 Kernel(Duration 最长)、内存传输与计算并行度低
交互操作Ctrl+滚轮放大;右键 Show in Events View / Zoom into Selection / Go to New Timeline

三、Moore Perf Compute:核函数微观分析

Moore Perf Compute 用于了解 MUSA Kernel 在 GPU 上的运行性能,以及 Kernel 如何利用底层硬件。它同样提供 GUI 和 CLI 两种方式来分析收集到的数据,这些数据被称为性能指标(Performance Metrics)。GUI 支持本地和远程两种模式;用 CLI 收集的数据也可以在 GUI 中打开。性能指标主要来自硬件计数器和软件插桩;为了完整采集这些指标,Moore Perf Compute 需要将 Kernel 多次执行——目前的做法是将整个应用程序重复执行多次。当程序中包含多个 Kernel 时,Moore Perf Compute 默认会分析所有 Kernel,用户也可以通过 GUI 或 CLI 配置仅对指定 Kernel 进行分析。

3.1 Kernel 过滤配置

GUI 的 Filter 选项卡中,Kernel Name 用于填写要过滤的内核名,Kernel Name Base 默认为 Mangled。CLI 对应的过滤参数如下:

-k [ --kernel-name ] arg
    Filter the kernel in one of the following ways:
      <kernel name>       Set the kernel name for an exact match.
      regex:<expression>  Set the regex to use for matching the kernel name.

--kernel-name-base arg (=function)
    Set the basis for --kernel-name:
      function
      demangled
      mangled

Kernel 过滤方式包括精确匹配(<kernel name>)与正则表达式匹配(regex:<expression>),并可通过 --kernel-name-base 选择基于函数名、demangled 名称还是 mangled 名称进行匹配。更多配置方式可在官网查阅 Moore Perf Compute 用户手册,或执行 mcu -h 查看帮助信息。

Step-by-Step:pow() 数学函数的双精度/单精度对比分析

教材以 Kernel 计算 a² + b 为例,其中调用了 MUSA 数学函数 pow()。详见第 9 章配套代码文件 powDemo.c。教材提到 pow() 有两个重载:powi() 用于计算双精度 double,powif() 用于计算单精度 float,下面比较这两个重载在 MTT S5000 上的运行结果。

⚠️
存疑:powi() / powif() 命名请勿直接照搬
powi() / powif() 这两个命名来自教材原文,与常见的 C 标准库 pow() 命名习惯不同,可能是 MUSA 数学库中的内部重载命名,教材没有给出更详细的函数签名定义。本课按原文照录,不做主观补全或猜测其确切签名——实际编码前请以已安装 MUSA 数学库头文件与当前官方文档为准。
  1. 先用 CLI 运行 double 类型示例:
    mcu <运行 double 类型可执行文件的命令>
  2. 观察 CLI 输出的 "GPU Speed Of Light Throughput" 表格:
    VectorPow(double*, unsigned int*) (1024, 1, 1)x(1024, 1, 1)
    Section: GPU Speed Of Light Throughput
    ------------------------------------------------
    Metric Name              Metric Unit   Metric Value
    ------------------------------------------------
    Compute(MP) Throughput        %           24.64
    Memory Throughput             %            9.65
    L1 Cache Throughput           %           11.72
    L2 Cache Throughput           %           21.16
    LLC Throughput                %            9.65
    DDR Throughput                %            0.01
    Duration                      us          32.23
    Elapsed Cycles              cycle       46,732
    MP Active Cycles            cycle       38,387
    MP Frequency                 Ghz          1.45
    LLC Frequency                Ghz          1.60
    DDR Frequency                Ghz          1.25
  3. 用 GUI 打开同一份报告,可以看到同样的 "GPU Speed of Light Throughput" 区域,并能进一步展开 Roofline 分析图。
  4. 切换到 float 类型重新运行,得到对比数据:
    Section: GPU Speed Of Light Throughput
    ------------------------------------------------
    Metric Name              Metric Unit   Metric Value
    ------------------------------------------------
    Compute(MP) Throughput        %           16.77
    Memory Throughput             %            9.92
    L1 Cache Throughput           %           10.42
    L2 Cache Throughput           %           17.25
    LLC Throughput                %            9.92
    DDR Throughput                %            0.53
    Duration                      us          20.95
    Elapsed Cycles              cycle       30,379
    MP Active Cycles            cycle       21,972
    MP Frequency                 Ghz          1.45
    LLC Frequency                Ghz          1.60
    DDR Frequency                Ghz          1.25
指标doublefloat
Duration (us)32.2320.95
Compute Throughput (%)24.6416.77
Memory Throughput (%)9.659.92
Elapsed Cycles46,73230,379
MP Active Cycles38,38721,972

可以看到 Duration 由 32.23 μs 降为 20.95 μs,教材原文表述为"性能提升了 35% 左右"。这说明在计算受限的场景下,通过将数据类型从 double 切换为 float(降低计算精度需求),能够有效降低 Kernel 执行时间,是一种典型的"针对计算受限 Kernel"的优化手段。

3.2 Speed of Light Throughput 与 Roofline 分析图

Speed of Light Throughput(光速吞吐量)指标用于衡量硬件资源的实际吞吐量与该资源理论峰值之间的比例,以百分比形式呈现,可直观反映计算核心或存储带宽距离硬件极限的"余量"。这种数据形式通常是性能调优中判定瓶颈方向的逻辑起点。

单击 "GPU Speed of Light Throughput" 左侧的折叠按钮,可查看生成的 Roofline 分析图(Floating Point Operations Roofline):横轴是 Arithmetic Intensity(FLOP/byte,算术强度),纵轴是 Performance(FLOP/s),图中划分出 Memory Bound Region(内存受限区域)与 Compute Bound Region(计算受限区域)。数据点落在图中不同位置,代表 Kernel 更接近计算受限还是内存受限。Roofline 分析图把 Kernel 的性能与 GPU 的硬件特性(计算峰值和内存带宽)结合起来,能更直观地说明示例中的 Kernel 受限于计算能力。

💡
Compute Throughput 高 ≠ 已经调到极限
当 Compute Throughput 相较于 Memory Throughput 更高时,代表 GPU 得到了更充分的利用,属于"计算密集型"任务,这是好事;但这也意味着如果想进一步提升 Kernel 性能(减少执行时间),需要寻找减少计算负载本身的方法(如算法优化、精度调整),而不是误以为已经到达优化极限、无法再进一步。这正是上面 double→float 案例展示的思路。

3.3 本节要点小结

维度Moore Perf Compute 提供的能力
分析层级核函数级(微观)
数据来源硬件计数器 + 软件插桩
采样方式需要重复执行 Kernel / 应用程序多次以完整采集指标
关键指标Compute(MP) Throughput、Memory Throughput、L1/L2 Cache Throughput、LLC/DDR Throughput、Duration、Elapsed Cycles、MP Active Cycles、MP/LLC/DDR Frequency
可视化Roofline 分析图(区分计算受限 / 内存受限)
过滤能力按 Kernel 名称精确匹配或正则匹配(GUI Filter 选项卡 / CLI -k、--kernel-name-base)

四、Step-by-Step 实验室:从系统级发现到核函数级验证

以下两个实验分别对应"宏观定位"和"微观优化"两个阶段,命令与参数均来自教材原文;若环境细节(GPU 型号、IP、模型权重路径)与教材不同,请按实际情况替换,文中已用【需替换】标出对应位置。

实验一:用 Moore Perf System 采集系统级性能数据

  1. 确认已在目标服务器上安装 Moore Perf Tools(Ubuntu 用 .deb + dpkg 安装,默认路径 /opt/moore-threads/moore-perf-system/;Windows 用图形化 .exe 安装向导)。
  2. 确保 GPU 驱动与 MUSA SDK 已正确安装。
  3. 在待分析程序运行期间(或通过 msys 拉起程序)执行采集命令:
    msys -t musa -gpu-metrics-set=0 -o 自定义报告名【需替换】
  4. 用 Moore Perf System GUI 打开生成的报告,切换到时间线视图。
  5. 依次展开 GPU 节点 → Processes → MUSA HW 节点,观察 Temperature / GPU Clock / GPU Memory Usage / GPU Power Usage 曲线。
  6. 按住 Ctrl + 滚轮放大时间线,寻找 GPU 执行间隙("空泡")。
  7. 选中 "All Streams" → 右键 → "Show in Events View",在 Events List 中按 Duration 降序排序,记录耗时最长的 Kernel 名称与耗时。

产出物:一份包含"最耗时 Kernel 名称 + 耗时 + 空泡区间描述"的分析记录。

实验二:用 Moore Perf Compute 对热点 Kernel 做微观分析

  1. 使用实验一中定位到的热点 Kernel 名称,配置 CLI 过滤:
    mcu -k kernel_name_或_regex表达式 --kernel-name-base function 运行命令【需替换】
  2. 查看输出的 "GPU Speed of Light Throughput" 表格,记录 Compute(MP) Throughput、Memory Throughput、Duration 等指标。
  3. 用 GUI 打开报告,展开 Roofline 分析图,判断该 Kernel 落在 Compute Bound Region 还是 Memory Bound Region。
  4. 若为计算受限:参照教材示例的优化思路,评估是否可以降低数值精度(如 double → float),重新运行分析并比较 Duration、Compute Throughput 的变化,验证优化效果。
  5. 若为内存受限:回到第二节思路,用 Moore Perf System 检查是否存在不必要的内存传输或可合并的访存操作。

产出物:优化前后指标对比表(至少包含 Duration、Compute Throughput、Memory Throughput)。

🚫
常见误区清单
误区一:只用 Moore Perf Compute、跳过 Moore Perf System——会在大量 Kernel 中盲目排查,效率低下,务必坚持"先 System 后 Compute"的自上而下顺序。
误区二:忽略"空泡"现象——GPU 执行间隙往往由 CPU 侧调度、数据准备或同步等待造成,不能只靠优化 Kernel 本身解决。
误区三:把高 Compute Throughput 简单等同于"性能已最优"——高吞吐说明 GPU 利用充分,但进一步提速需要减少计算负载本身。
误区四:分析指标时未重复执行多次——Moore Perf Compute 的性能指标依赖多次重复执行 Kernel/应用程序采集,单次运行数据可能不完整或不稳定。
排错提示:若未检测到 GPU 或指标全为异常值,优先检查 GPU 驱动和 MUSA SDK 是否正确安装,这是运行 Moore Perf Tools 的前置条件。

五、版本与兼容性

项目本课校准基线(2026-07-30)备注
MUSA SDK5.2.0Moore Perf Tools 与本课涉及的 msys / mcu CLI 均以此 SDK 基线为坐标
Moore Perf System 版本教材示例使用 1.4.0教材成书时的版本号,实际安装版本请以官网下载页当前版本为准
PyTorch 侧torch_musa 2.9.1教材 llama3 8B 分析示例属于典型的 PyTorch 推理场景,与本课工具链一致
主要参考 GPUMTT S5000(平湖)教材 CLI 示例(8 卡 S5000 服务器分析 llama3 8B)与 pow() 双精度/单精度对比示例均在该型号上完成
Linux 安装形式仅 Ubuntu .deb 包非 Ubuntu 发行版适配方式教材未展开,不做猜测
存疑项powi() / powif() 命名与常见 C 标准库命名习惯不同,教材未给出详细签名,不做猜测性补全
⚠️
纸质教材 ≠ 当前工具版本,命令行参数请以 -h 输出为准
Moore Perf Tools 作为独立发布的分析工具套件,其 CLI 参数、GUI 交互细节会随版本升级发生变化。教材示例基于 Moore Perf System 1.4.0 编写,纸质内容可能对应更早期或更晚的工具版本。本课涉及的所有命令行参数(如 -t musa、-gpu-metrics-set=0、-k、--kernel-name-base)请先执行 msys -h 或 mcu -h 核对当前安装版本的实际参数列表,再结合官网用户手册确认,不要直接照抄教材命令用于生产环境。

六、本课与相邻课程

  • m11-l5(第 8 章):性能优化与扩展——本课的 Moore Perf System/Compute 正是第 8 章 Occupancy、访存优化等技术手段"落地验证"所需的观测工具
  • m11-l4(第 4 章):软件架构——第 4 章第六节仅对 Moore Perf Tools 做了概览,本课是其完整展开
  • m11-l11(第 10 章):应用实战——GROMACS MUSA 优化案例中会直接复用本课的 Moore Perf System 定位热点 Kernel 的方法
  • m11-l3(第 3 章):编程模型——理解 Kernel、Stream、内存传输的基本概念是读懂时间线视图的前提
✓
本课小结
第 9 章围绕 Moore Perf Tools 建立了一套完整的"系统级宏观分析—核函数微观优化"诊断链路。Moore Perf System 提供 GUI 与 CLI 两种方式,以时间线形式呈现 CPU 线程活动、GPU 利用率、内存传输、MUSA API 调用等关键指标,核心价值在于快速定位宏观瓶颈——例如 GPU 执行中的"空泡"、数据传输与计算并行度低等,为后续优化提供明确方向。Moore Perf Compute 专注核函数微观剖析,通过硬件计数器与软件插桩采集 Compute Throughput、Memory Throughput 等精细化指标,并以 Roofline 分析图判断 Kernel 是计算受限还是内存受限,支持按 Kernel 名称过滤分析。教材的 pow() 示例证明:把 double 换成 float 这类看似简单的操作,在计算受限场景下能带来约 35% 的 Duration 缩短——但这类优化必须先经过 Speed of Light Throughput 和 Roofline 分析确认瓶颈方向,而不是凭直觉猜测。一句话记住本章:先用 System 找到"哪个 Kernel 慢",再用 Compute 搞清楚"为什么慢",最后才动手改代码。