# Day 5 Supporting PMUs on RISC-V platforms (一)

今天来看 RISC-V 系列的最後一篇文件,Supporting PMUs on RISC-V platforms
在这里可以看到一个年轻的指令集架构(ISA),在成长的过程中,可能会经历到的变化!

PMU (Performance Monitoring Unit) 是一个大多数处理器都具备的特殊 on-chip 硬体,
可以用来观察微架构事件 (Microarchitectural event),像是 cycle 数、cache hit/miss 数... 等等;
而这个硬体也是 perf 等效能剖析工具,所使用的基础设施。

文件

========================
在 RISC-V 平台上支援 PMUs
========================

Alan Kao <[email protected]>, Mar 2018

简介
----

在这篇文件撰写之时,RISC-V 特权指令集架构 1.10 版本所描述的 perf 事件相关的项目包含下列几项:
(RISC-V 文件会有更多细节)

* [m|s]counteren
* mcycle[h], cycle[h]
* minstret[h], instret[h]
* mhpeventx, mhpcounterx[h]

仅仅只有上述的项目的话,要移植 perf 会需要很多的手续,
由於 RISC-V 目前缺乏以下大多数架构通用的效能监测特色:

* 启动/关闭 计数器
  计数器无时无刻都在做动。
* 计数器数值溢位造成的中断
  规格并为定义这样的事件。
* 中断指示器
  不可能让每个计数器有自己的中断 port,所以必须要有一个中断指示器来告诉软件,是哪一个计数器数值溢位了。
* 写入数值到计数器中
  将来会有 SBI 来支援这项功能,因为核心本身并没有能力修改计数器。[1]
  又或是,有些厂家会有扩充的硬体实作来支援 M-S-U 特权架构的平台来直接对计数器做写入的操作。

这份文件目标是提供开发者一份快速上手的守则,让开发者可以在核心中实作 PMU 相关的功能;
接下来的几个章节会简单的介绍 perf 机制以及待完成的事项。

[1][2] 有先前的讨论供参考。
另外,附录 A 有相关的核心资料结构,认识这些资料结构会对理解本文有帮助。

我的理解

  • [m|s]counteren
    • prefix 的 m|s 表示的是 m mode 或是 s mode 的 register,RISC-V 的特权架构分为,m(achine) mode、s(upervisor) mode、u(ser) mode。
    • counteren 是 counter enable 的意思,但相较於名字,实际功能却是在定义,下一个 privilege 层级是否对 hpm (hardware performance monitoring) 相关暂存器有存取的权力。
  • mcycle[h]、minstret[h]、mhpmeventn、mhpmcountern[h]
    • mcycle 是记录该 hart 所执行的 cycle 数,suffix 的 h 表示 high,用於 xlen == 32 时,读取 mcycleh 等於读取 mcycle 的高位 32 bit ([63:32])。
    • minstret 是记录该 hart 所执行的 instruction 数,suffix h 同上表示 high,且用途相同。
    • mhpmeventm 是事件暂存器,这 29 个事件暂存器,由各自平台来做实作,可以指定 mhpmcounter 计数器要针对哪些事件来进行计数。
    • mhpmcountern 是事件计数器,有 29 个,mhpmcounter3-mhpmcounter31,(0: no event, 1: cycle, 2: intstruction)。
  • 相关硬体监测的名词在 RISC-V 规范中叫做 HPM (Hardware Performance Monitor),而在特权指令集架构 1.10 版本中,只有上述的描述以及暂存器可使用,文中提到 RISC-V 1.10 版本所缺乏的功能,大多数的架构其实是都支援的,如下:
    1. 开关计数器的功能,并没有被定义,所以会没有能够启动或是停止计数的能力,如此也无法直觉的计算各种功能所执行的 cycle 数。
    2. 计数器数值溢位,在当时的规格中,并没有定义的中断,所以必须不断的 polling 来确认有没有数值溢位发生,若有溢位发生,则需要一些运算来计算出正确的计数器数值。
    3. 计数器溢位中断指示器,如同上述第二点,若有溢位中断的话,会需要一个中断指示器来确认是哪一个事件的计数器溢位了。
    4. 写入数值到计数器中,1.10版本,这些计数器都是在 m mode 且是 read-only,作业系统作为一个 s mode 的软件,目前没有一个可以写入计数器的方法 (e.g. 归零计数器)

後记

  • 规格的文字真的是很精炼,有些意思其实要揣摩一下,但还是不太确定实际意思
    • 像是最後 read-only 计数器的部分,在原文中是 The cycle, instret, and hpmcountern CSRs are read-only shadows of mcycle, minstret, and mhpmcountern, respectively. The time CSR is a read-only shadow of the memory-mapped mtime register

其实这篇文件就是我们铁人赛团长的着作,在当初 RISC-V Manual 并没有完整支援 HPM 时,所提出的快速上手守则,而最近相关的 RISC-V 扩充指令集已经趋於完备,"Sscofpmf" extension,(由团长及团员提点所知道的XD),会在接下来的几篇铁人文中,研究并记录这个发展的过程,那麽今天就先到这里吧!
感谢大家,明天见!


<<:  第九天:使用 Gradle Wrapper

>>:  [Day4] 第一个矩形

<Day30>动手做 Demo App(下)

使用 room 来建立Database abstract class AppDatabase: Ro...

EP 23: SQLite DB in Android and iOS for TopStore App

Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...

[Day1]前言:为何选择学习区块链?

关於我... hi~我是一个大三的学生,就读医学资讯。因为科系有学到一些资讯,加上系上的必修课需要...

Day3 阿里云使用须知与中国网路

前言:   随着网路时代普及生活化,各国政府对IT资讯产业也推行了相当多的管理法案以维护网际网路使用...

Angular 冒泡事件

今天就来个说个在新手时期很常遇到,但却不知为什麽会发生的问题 来看一下我们前几天的表单范例,与图上 ...