飞腾平台perf工具PMU事件集成指南

news2024/12/26 10:55:28
     【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。 点击这里开始你的技术升级之旅吧

image.png​​​​

本文分享至飞腾开发者平台《飞腾平台perf工具PMU事件集成指南》

1 软件介绍

  perf是内置于Linux-2.6+内核源码中的性能剖析工具。通过对各类性能事件的计数统计,以及在事件发生时对运行代码路径(调用栈)等进行采样记录,支持查找性能瓶颈、定位热点代码。perf支持的性能事件包括:硬件事件、软件事件、跟踪事件。其中,硬件事件由处理器实现的PMU(Performance Monitor Unit,性能监视单元)产生,探测各类与架构、微架构等相关性能事件发生的次数,例如cache-misses、cpu-cycles、instructions、branch-misses等。关于perf的更多信息可阅读参考文献【2】、【3】,关于PMU的更多信息可阅读参考文献【1】。

  如下表perf list查看事件名称所示,perf为常用的硬件事件提供了符号名称(又称“事件别名“”),可以通过“-e 事件名称”的方式指定进行统计或采用的事件。对于各厂商实现的未提供符号名称的硬件事件,可以通过原始硬件事件编号“rNNN”的方式进行指定,但是使用起来不够直观和便捷。

List of pre-defined events (to be used in -e):

 branch-misses                   [Hardware event]

 bus-cycles                      [Hardware event]

 cache-misses                    [Hardware event]

 ...

 L1-dcache-load-misses                [Hardware cache event]

 L1-dcache-loads                      [Hardware cache event]

 L1-icache-load-misses                [Hardware cache event]

 ...

 br_mis_pred OR armv8_pmuv3_0/br_mis_pred/     [Kernel PMU event]

 br_pred OR armv8_pmuv3_0/br_pred/             [Kernel PMU event]

 bus_access OR armv8_pmuv3_0/bus_access/       [Kernel PMU event]

 ...

 rNNN                                       [Raw hardware event descriptor]

 cpu/t1=v1[,t2=v2,t3 ...]/modifier          [Raw hardware event descriptor]

  本文档以飞腾FTC6xx系列核心实现的硬件事件为例,说明如何在Linux内核上为飞腾PMU硬件事件建立perf符号名称、实现自定义硬件事件集成的方法。

2 环境要求

2.1 硬件环境

  硬件环境要求如下表硬件环境所示。

项目说明
CPUFTC66X系列核心(FT-2000/4、FT-2000+/64)

2.2 软件环境

  软件环境要求如下表所示。perf工具源码位于Linux内核源码目录中,使用内核的头文件。因此理论上保持perf和内核版本一致,能够完全保证接口的一致性。实践中,由于perf的用户-内核接口比较稳定,所以跨版本使用也没有问题。由于编译内核时并不会编译perf工具,因此可以从kernel.org获取与当前运行内核版本一致的内核源码包,解压内核源码并进入perf目录(cd tools/perf)执行make以构建perf工具。

项目说明
OSCentOS 8.3
kernel4.19.5
patchpatch-4.19.5-phytium.patch(飞腾补丁)
perf4.19.5

3 功能模块

  perf由pmu-events模块(tools/perf/pmu-events)实现对各厂商自定义硬件事件的集成。

  pmu-events由jevents工具、mapfile.csv文件、JSON文件组成:
  1)JSON文件用于描述PMU事件,包括事件编号、事件名称、事件说明等信息;

  2)mapfile.csv文件用于实现CPU型号与PMU事件集的映射;

  3)jevents工具基于mapfile.csv文件和JSON文件,生成pmu-events.c文件,其中包含一组PMU事件表和一张映射表。每张PMU事件表(如下表PMU事件表示例所示)描述当前硬件架构下各种CPU型号的硬件事件信息,映射表(如下表映射表示例所示)则建立CPU型号与PMU事件表的映射关系。pmu-events.c文件编译后用于构建perf工具。

  perf工具运行时通过确定所在的CPU型号,查找匹配的PMU事件表,从而为事件建立符号名称,实现自定义硬件事件的集成。

  PMU事件表示例

struct pmu_event pme_arm_cortex_a53[] = {

{

        .name = "br_indirect_spec",

        .event = "event=0x7a",

        .desc = "Branch speculatively executed, indirect branch",

        .topic = "branch",

        .long_desc = "Branch speculatively executed, indirect branch",

},

... ...

}

  映射表示例

struct pmu_events_map pmu_events_map[] = {

{

        .cpuid = "0x00000000410fd03[[:xdigit:]]",

        .version = "v1",

        .type = "core",

        .table = pme_arm_cortex_a53

},

... ...

}

4 接口说明

  由上述功能模块组成可知,pmu-events模块主要通过JSON文件和mapfile.csv文件对外提供自定义硬件事件集成的接口。本节以arm的cortex-a53为例,对上述文件的布局和内容进行说明。

4.1 文件布局

  如下表arch目录层次结构所示,arch目录下按照“架构/厂商/型号”的层次结构布局。

  mapfile.csv文件放置在“架构”级别目录下。用于描述架构标准事件的架构标准JSON文件放置在“架构”级别目录下,例如armv8-recommended.json。用于描述各型号CPU的PMU事件JSON文件放置在对应“型号”级别目录下。型号JSON文件中可以使用“ArchStdEvent”来引用定义在架构标准JSON文件中的“架构标准事件”,基于“EventName”字段进行匹配。建议将CPU所支持的PMU事件按模块进行分组并放在独立的JSON文件里,例如cortex-a53的branch.json、bus.json、cache.json、memory.json、pipeline.json等。

pmu-events

├── arch

│   ├── arm64

│   │   ├── arm

│   │   │   └── cortex-a53

│   │   │     ├── branch.json

│   │   │     ├── bus.json

│   │   │     ├── cache.json

│   │   │     ├── memory.json

│   │   │     ├── other.json

│   │   │     └── pipeline.json

│   │   ├── armv8-recommended.json

│   │   ├── mapfile.csv

... ...

4.2 JSON文件

  如下表JSON文件内容所示,用于描述PMU事件信息的主要项目包括:

  • EventCode:事件原始编号;
  • EventName:对应的事件符号名称;
  • PublicDescription:事件的详细说明;
  • BriefDescription:事件的简要说明;
  • ArchStdEvent:直接使用架构标准JSON文件中定义的事件信息,指定EventName进行匹配。

    [
    
      {
    
          "PublicDescription": "Attributable Level 1 data cache access, read",
    
          "EventCode": "0x40",
    
          "EventName": "L1D_CACHE_RD",
    
          "BriefDescription": "L1D cache access, read"
    
      },
    
      ... ...
    
      {
    
          "ArchStdEvent": "BUS_ACCESS_RD",
    
      },
    
      ... ...
    
    ]

4.3 mapfile.csv文件

如下表mapfile.csv文件内容所示,用于描述CPU型号与PMU事件集的映射关系的主要项目包括:

  • Family-model:CPUID(64bits),其中,[31-24]是销售ID(Implementer),[23-20]是大版本号(Variant),[19-16]是架构版本(Architecture),[15-4]是产品代码(PartNum),[3-0](Revision)是小版本号。需要注意的是:大版本号和小版本号(即[23:20]和[3:0]位)需要置零;
  • Version:JSON文件版本号(未使用);
  • PathName:JSON文件的路径,相对于tools/perf/pmu-events/arch/[架构];
  • Type:PMU事件的类型,如core/uncore等。
#Family-model,Version,Filename,EventType

    0x00000000410fd03[[:xdigit:]],v1,arm/cortex-a53,core

    0x00000000420f5160,v1,cavium/thunderx2,core

    0x00000000430f0af0,v1,cavium/thunderx2,core

... ...

  文件实例

  表phytium/ftc66x的JSON文件、表phytium/ftc66x的mapfile.csv文件所示,本节以飞腾FTC6xx系列核心实现的硬件事件为例,给出对应的mapfile.csv文件、JSON文件。

  表phytium/ftc66x目录结构

pmu-events

├── arch

│   ├── arm64

│   │   ├── armv8-recommended.json

│   │   ├── mapfile.csv

│   │   └── phytium

│   │     └── ftc66x

│   │       └── ft.json

  表phytium/ftc66x的JSON文件

[

 {

     "PublicDescription": "Architectural-CHAIN",

     "EventCode": "0x1e",

     "EventName": "CHAIN",

     "BriefDescription": "Architectural-CHAIN"

 },

 {

     "ArchStdEvent": "L1D_CACHE_RD"

 },

 {

     "ArchStdEvent": "L1D_CACHE_WR"

 },

 {

     "ArchStdEvent": "L1D_CACHE_REFILL_RD"

 },

 {

     "ArchStdEvent": "L1D_CACHE_REFILL_WR"

 },

 {

     "ArchStdEvent": "L1D_CACHE_WB_VICTIM"

 },

... ...

]

  表phytium/ftc66x的mapfile.csv文件

#Family-model,Version,Filename,EventType

... ...

0x00000000700f6620,v1,phytium/ftc66x,core

0x00000000700f6630,v1,phytium/ftc66x,core

  完成上述事件集成操作之后,如表perf list可以列出新增的ft事件名称。

  表perf list

List of pre-defined events (to be used in -e):

 branch-misses                   [Hardware event]

 bus-cycles                     [Hardware event]

 cache-misses                    [Hardware event]

 ... ...

 L1-dcache-load-misses               [Hardware cache event]

 L1-dcache-loads                  [Hardware cache event]

 L1-icache-load-misses               [Hardware cache event]

 ... ...

 armv8_pmuv3_0/br_mis_pred/             [Kernel PMU event]

 armv8_pmuv3_0/br_pred/               [Kernel PMU event]

 armv8_pmuv3_0/bus_access/             [Kernel PMU event]

 ... ...

ft:

 ase_spec

 [Operation speculatively executed, Advanced SIMD instruction]

 br_immed_spec

 [Branch speculatively executed, immediate branch]

 br_indirect_spec

 [Branch speculatively executed, indirect branch]

 ... ...

 rNNN                        [Raw hardware event descriptor]

 cpu/t1=v1[,t2=v2,t3 ...]/modifier         [Raw hardware event descriptor]

 (see 'man perf-list' on how to encode it)

5 常见问题

5.1 问题描述

  CPUID是mapfile.csv文件中的关键项目,用于匹配当前硬件环境中的CPU型号以实现perf中的PMU事件符号名称。那么,如何获取CPUID?

5.2 问题处理

  方法一:

  执行cat /sys/devices/system/cpu/cpu0/regs/identification/midr_el1。需要注意的是,大版本号和小版本号(即[23:20]和[3:0]位)需要置零。

  表 cat /sys/devices/system/cpu/cpu0/regs/identification/midr_el1

#cat /sys/devices/system/cpu/cpu0/regs/identification/midr_el1
0x00000000701f6622

  方法二:

  执行 perf list --debug。可以直接获得可以用于当前硬件环境下的CPUID。

  表perf list --debug

#perf list --debug

Using CPUID 0x00000000700f6620

List of pre-defined events (to be used in -e):

 branch-misses                   [Hardware event]

... ...

6 参考资料

  [1] ARM Cortex-A72 MPCore Processor Technical Reference Manual r0p3(2016)

  [2] perf学习总结,https://zhuanlan.zhihu.com/p/141694060(2020)

  [3] perf wiki, https://perf.wiki.kernel.org/index.php/Tutorial(2015)

推荐阅读

  • 基于飞腾平台的OpenCV的编译与安装
  • 基于飞腾平台的Sqoop的安装配置

欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料

如开发者在使用飞腾产品有任何问题可通过在线工单联系我们


版权所有。飞腾信息技术有限公司 2023。保留所有权利。

未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。

商标声明

Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。

本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2158396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware安装ubuntu24.04桌面版

一、安装推荐要求 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 二、下载桌面系统 下载地址(使用手机转存再下载是对作者的最大支持):夸克网盘分享 (quark.cn) 已安装的纯净版ubuntu虚拟…

CMake 构建Qt程序弹出黑色控制台

CMake 构建Qt程序弹出黑色控制台

普通查询+聚合函数的使用(8个例子,数值和字符串的比较)

目录 回顾普通查询聚合函数的使用 表数据 例子1 例子2 例子3 ​​​​​​​例子4 例子5 例子6 例子7(数值和字符串的比较) 例子8 回顾普通查询聚合函数的使用 之前我们介绍过聚合函数 --mysql分组查询 -- 聚合函数(介绍,使用),group by使用,分组聚合统计(使用,havi…

MATLAB基本语句

MATLAB语言为解释型程序设计语言。在程序中可以出现顺序、选择、循环三种基本控制结构,也可以出现对M-文件的调用(相当于对外部过程的调用)。 由于 MATLAB开始是用FORTRAN语言编写、后来用 C语言重写的,故其既有FORTRAN的特征,又在许多语言规…

基于JAVA+SpringBoot+Vue的医院资源管理系统

基于JAVASpringBootVue的医院资源管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈…

基于SpringBoot的医院管理系统【附源码】

基于SpringBoot的医院管理系统(源码L文说明文档) 目录 4 系统设计 4.1 系统概述 4系统概要设计 4.1概述 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 医生模块的实现 5.1.…

音视频入门基础:FLV专题(3)——FLV header简介

一、引言 本文对FLV格式的FLV header进行简介,FLV文件的开头就是FLV header。 进行简介之前,请各位先从《音视频入门基础:FLV专题(1)——FLV官方文档下载》下载FLV的官方文档《video_file_format_spec_v10_1.pdf》和…

猫咪掉毛背后的隐秘原因?除毛除臭宠物空气净化器双管齐下!

作为一个二胎家庭,两只猫咪,除了卖萌加倍之外,拉屎需要排队之外,家里最不缺就是毛了。作为一个名鼻炎患者真的很难顶。感受一下40度高温的养猫人,给掉毛怪疏毛浮毛飘飘,逃不过的饮水机,各个角落…

wpf,工具栏上,最小化按钮的实现

工具栏上&#xff0c;最小化按钮的实现。工具栏做成的是用户控件。 用户控件的xaml <Button HorizontalAlignment"Right" Height"32" Click"MinimizeClick" /> 用户控件的cs代码 private void MinimizeClick(object sender, RoutedEven…

IDEA创建Web项目(详细版)

目录 1 新建Web项目 步骤如下 1 打开idea,选择新建项目 2 点击创建 3 点击项目结构&#xff0c;选择添加模块 ---web 2 配置Tomcat 步骤如下 1 点击Edit Configurations&#xff08;编辑配置&#xff09; 1.1 右上角当前文件下 选择编辑配置 1.2 点击菜单栏中run 选…

奔驰「进退」两难

合资车企&#xff0c;尤其是BBA为代表的传统豪华品牌&#xff0c;正在进入阵痛期。 9月14日&#xff0c;奔驰在华合资公司—腾势新能源发生工商变更&#xff0c;比亚迪受让前者剩余10%股份&#xff0c;并变更为旗下全资子公司。至此&#xff0c;这个由奔驰和比亚迪在2011年成立…

Python 从入门到实战25(模块)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了类继承的相关知识。今天我们将学习一下模块的…

Linux 进程间通信(管道)

目录 一.理解进程间通信 1.进程间通信的意义 2.进程间如何实现通信呢&#xff1f; 二.匿名管道 1.匿名管道的底层原理 引用计数的应用 2.匿名管道代码实现 a.代码的整体框架 b.写接口 c.读接口 d.子进程资源回收 3.匿名管道的官方接口 4.*匿名管道四种情况和五种特…

Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现

问题&#xff1a;Leetcode 2246. 相邻字符不同的最长路径 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&#xff0c;根节点是节点 0 &#xff0c;这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树&#x…

数据结构——顺序表、链表

目录 前言 一&#xff0c;数据结构 1&#xff0c;什么是数据结构&#xff1f; 2&#xff0c;有什么类型&#xff1f; 二&#xff0c;顺序表 1&#xff0c;线性表 2&#xff0c;顺序表基本结构 3&#xff0c;动态顺序表的功能实现 三&#xff0c;链表 1&#xff0c;链…

Go 1.19.4 路径和目录-Day 15

1. 路径介绍 存储设备保存着数据&#xff0c;但是得有一种方便的模式让用户可以定位资源位置&#xff0c;操作系统采用一种路径字符 串的表达方式&#xff0c;这是一棵倒置的层级目录树&#xff0c;从根开始。 相对路径&#xff1a;不是以根目录开始的路径&#xff0c;例如 a/b…

torch.nn系列函数学习 --- Conv2d函数

该函数的官方文档&#xff1a; https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone)…

排序题目:将矩阵按对角线排序

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;将矩阵按对角线排序 出处&#xff1a;1329. 将矩阵按对角线排序 难度 5 级 题目描述 要求 矩阵对角线是一条从矩阵最上面行或者最左侧列中的某…

CentOS Linux教程(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑)&#xff0c;然后C盘、D盘。 Linux系统的根目录是/&#xff0c;我们可以使用cd /进入根目录&#xff0c;然后使…

共享打印机,局域网搜不到

如果共享打印机后&#xff0c;局域网内其余机器检索不到 1. 排查 是否启用来宾账户&#xff08;Guest&#xff09; 2. 网络和共享中心->更改高级共享设置->启用网络发现、启用文件和打印机共享、关闭密码保护共享 排查基本可以解决搜索不到打印机问题