iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Software Development

閱讀 Linux Kernel 文件系列 第 5

# 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 <alankao@andestech.com>, 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),會在接下來的幾篇鐵人文中,研究並記錄這個發展的過程,那麼今天就先到這裡吧!
感謝大家,明天見!


上一篇
# Day 4 Feature status on riscv architecture
下一篇
# Day 6 Supporting PMUs on RISC-V platforms (二)
系列文
閱讀 Linux Kernel 文件30

尚未有邦友留言

立即登入留言