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 图形化安装向导 | 双击运行安装包,按界面提示完成操作即可 |
.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"
- 展开 GPU 节点,查看 GPU Metrics 信息,包括温度(Temperature)、GPU 时钟(GPU Clock)、GPU 显存使用(GPU Memory Usage)、GPU 功耗使用(GPU Power Usage)。
- 展开 Processes 下的 MUSA HW 节点,查看 MUSA API 调用、Kernel 执行情况、Memory 操作情况。
- 放大视图看细节:默认视图数据过于密集,不利于观察真实执行情况。按住
Ctrl键、滚动鼠标滚轮即可放大。 - 观察"空泡"现象:放大后通常会看到 GPU 上内存传输和 Kernel 执行重复出现,且大量时间被耗费在执行 Kernel 上、内存传输很少;但在一些重复活动之间会存在一段"空泡"(GPU 空闲间隙)。定位造成空泡的 CPU 侧原因、进而提升 GPU 利用率,是关键优化目标之一。
- 区域选择与右键菜单:进一步放大后选中一块区域并右键,可选择 Zoom into Selection(放大选择区域)、Go to New Timeline(在新时间线中打开选择区域),菜单中还包含 Add/Clear Measuring Line、Undo Zoom(快捷键 Backspace)、Reset Zoom(快捷键 Ctrl+H)等辅助操作。
- Events View 定位热点:选中 "All Streams" 右键选择 "Show in Events View",该节点下的所有活动都会展示在下方 Events List 中;单击 "Duration" 列按时间降序排列,即可找到"热点" Kernel(教材示例中约耗费 15 ms)。双击该 Kernel,会在时间轴上以蓝色突出显示与之相关的所有事件。
- 衔接 Moore Perf Compute:定位到热点 Kernel 后,用 Moore Perf Compute 对该 Kernel 做进一步的微观分析——这是第三节的内容。
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() 这两个命名来自教材原文,与常见的 C 标准库 pow() 命名习惯不同,可能是 MUSA 数学库中的内部重载命名,教材没有给出更详细的函数签名定义。本课按原文照录,不做主观补全或猜测其确切签名——实际编码前请以已安装 MUSA 数学库头文件与当前官方文档为准。- 先用 CLI 运行 double 类型示例:
mcu <运行 double 类型可执行文件的命令> - 观察 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 - 用 GUI 打开同一份报告,可以看到同样的 "GPU Speed of Light Throughput" 区域,并能进一步展开 Roofline 分析图。
- 切换到 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
| 指标 | double | float |
|---|---|---|
| Duration (us) | 32.23 | 20.95 |
| Compute Throughput (%) | 24.64 | 16.77 |
| Memory Throughput (%) | 9.65 | 9.92 |
| Elapsed Cycles | 46,732 | 30,379 |
| MP Active Cycles | 38,387 | 21,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 受限于计算能力。
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 采集系统级性能数据
- 确认已在目标服务器上安装 Moore Perf Tools(Ubuntu 用
.deb+dpkg安装,默认路径/opt/moore-threads/moore-perf-system/;Windows 用图形化.exe安装向导)。 - 确保 GPU 驱动与 MUSA SDK 已正确安装。
- 在待分析程序运行期间(或通过
msys拉起程序)执行采集命令:msys -t musa -gpu-metrics-set=0 -o 自定义报告名【需替换】 - 用 Moore Perf System GUI 打开生成的报告,切换到时间线视图。
- 依次展开 GPU 节点 → Processes → MUSA HW 节点,观察 Temperature / GPU Clock / GPU Memory Usage / GPU Power Usage 曲线。
- 按住
Ctrl+ 滚轮放大时间线,寻找 GPU 执行间隙("空泡")。 - 选中 "All Streams" → 右键 → "Show in Events View",在 Events List 中按 Duration 降序排序,记录耗时最长的 Kernel 名称与耗时。
产出物:一份包含"最耗时 Kernel 名称 + 耗时 + 空泡区间描述"的分析记录。
实验二:用 Moore Perf Compute 对热点 Kernel 做微观分析
- 使用实验一中定位到的热点 Kernel 名称,配置 CLI 过滤:
mcu -k kernel_name_或_regex表达式 --kernel-name-base function 运行命令【需替换】 - 查看输出的 "GPU Speed of Light Throughput" 表格,记录 Compute(MP) Throughput、Memory Throughput、Duration 等指标。
- 用 GUI 打开报告,展开 Roofline 分析图,判断该 Kernel 落在 Compute Bound Region 还是 Memory Bound Region。
- 若为计算受限:参照教材示例的优化思路,评估是否可以降低数值精度(如 double → float),重新运行分析并比较 Duration、Compute Throughput 的变化,验证优化效果。
- 若为内存受限:回到第二节思路,用 Moore Perf System 检查是否存在不必要的内存传输或可合并的访存操作。
产出物:优化前后指标对比表(至少包含 Duration、Compute Throughput、Memory Throughput)。
误区二:忽略"空泡"现象——GPU 执行间隙往往由 CPU 侧调度、数据准备或同步等待造成,不能只靠优化 Kernel 本身解决。
误区三:把高 Compute Throughput 简单等同于"性能已最优"——高吞吐说明 GPU 利用充分,但进一步提速需要减少计算负载本身。
误区四:分析指标时未重复执行多次——Moore Perf Compute 的性能指标依赖多次重复执行 Kernel/应用程序采集,单次运行数据可能不完整或不稳定。
排错提示:若未检测到 GPU 或指标全为异常值,优先检查 GPU 驱动和 MUSA SDK 是否正确安装,这是运行 Moore Perf Tools 的前置条件。
五、版本与兼容性
| 项目 | 本课校准基线(2026-07-30) | 备注 |
|---|---|---|
| MUSA SDK | 5.2.0 | Moore Perf Tools 与本课涉及的 msys / mcu CLI 均以此 SDK 基线为坐标 |
| Moore Perf System 版本 | 教材示例使用 1.4.0 | 教材成书时的版本号,实际安装版本请以官网下载页当前版本为准 |
| PyTorch 侧 | torch_musa 2.9.1 | 教材 llama3 8B 分析示例属于典型的 PyTorch 推理场景,与本课工具链一致 |
| 主要参考 GPU | MTT S5000(平湖) | 教材 CLI 示例(8 卡 S5000 服务器分析 llama3 8B)与 pow() 双精度/单精度对比示例均在该型号上完成 |
| Linux 安装形式 | 仅 Ubuntu .deb 包 | 非 Ubuntu 发行版适配方式教材未展开,不做猜测 |
| 存疑项 | powi() / powif() 命名 | 与常见 C 标准库命名习惯不同,教材未给出详细签名,不做猜测性补全 |
-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、内存传输的基本概念是读懂时间线视图的前提
double 换成 float 这类看似简单的操作,在计算受限场景下能带来约 35% 的 Duration 缩短——但这类优化必须先经过 Speed of Light Throughput 和 Roofline 分析确认瓶颈方向,而不是凭直觉猜测。一句话记住本章:先用 System 找到"哪个 Kernel 慢",再用 Compute 搞清楚"为什么慢",最后才动手改代码。