?

基于功耗計數器的處理器功耗實時估算方法①

2024-02-13 12:25賈凡章隆兵
高技術通訊 2024年1期
關鍵詞:計數器功耗時鐘

賈凡 章隆兵

(計算機體系結構國家重點實驗室(中國科學院計算技術研究所) 北京100190)

(中國科學院計算技術研究所 北京100190)

(中國科學院大學 北京100049)

動態功耗管理是提升處理器能效的重要方式之一[1],準確的功耗估算可以指導處理器實施精確的功耗管理[2]。長期以來,研究人員一直利用從處理器中篩選出來的性能事件計數器來構建功耗模型。最近的一些研究發現,使用電路信號的變化次數可以構建出更高精度的功耗模型。

這2 種實時功耗估算方法各有優缺點?;谛阅苁录嫈灯鞯姆椒ú粫碛布_銷,但它們的采樣間隔大多超過200 ms?;陔娐沸盘柕姆椒ň哂袝r鐘周期級的精度,但它們需要過多的電路信號來構建功耗模型,從而導致較高的硬件開銷。

本文提出了一種同時具有基于性能事件計數器的低硬件開銷和基于電路信號的高精度的實時功耗估算方法,并且在龍芯GS364 處理器核中實現了這個方法。本文的主要貢獻如下:首先,提出了功耗計數器,它記錄了處理器中特定的電路信號在一段時間內的翻轉次數,同時構建了一個基于功耗計數器的輕量級實時功耗預測方法,它使用片上電源管理模塊讀取功耗計數器并實時估算處理器的功耗;其次,設計了一個輕量級的功耗模型構建框架,該框架采用8 個周期的程序切片作為分析單元,并且對訓練集程序進行剪枝操作,以提高模型的構建速度;最后,在龍芯GS364 處理器中實現了上述方法,并評估了該方法的預測準確度和硬件開銷。

1 背景介紹

基于性能事件計數器和基于電路信號的處理器功耗實時估算方法使用相似的功耗模型,這2 種方法都認為使用處理器中的一些特定事件可以估算處理器的動態功耗,如式(1)所示。

其中,Q是功耗模型中篩選的特征數量,wj是第j個特征的權重,xj是第j個特征的變化次數。在基于性能事件計數器的功耗預測方法中,xj表示某個性能事件計數器的值。在基于電路信號的方法中,xj表示某個電路信號的翻轉次數。

這2 類方法構建功耗模型的流程大致相似,包括構建訓練程序、獲取訓練程序的功耗數據、獲取性能事件或信號翻轉的發生次數、性能事件或電路信號的篩選,以及計算各參數的權重?;谛阅苁录嫈灯鞯墓墓浪惴椒ㄍㄟ^操作系統或功耗管理模塊讀取相應性能事件計數器的值,并使用軟件來估算功耗?;陔娐沸盘柕墓念A測方法則通過硬件機制收集電路信號的翻轉并計算功耗,以達到時鐘周期級的精確度。

1.1 基于性能事件計數器的功耗預測方法

基于性能事件計數器的功耗預測方法有很長發展歷程。早期的研究[3]根據設計者經驗從中央處理器(central processing unit,CPU)各個模塊中選擇一個或多個性能事件,使用線性回歸算法計算每個性能事件的權重。最近的一些研究[4]引入了基于統計學或機器學習的性能事件自動選擇策略,以避免納入模型的性能事件之間存在多重共線性。此類方法使用片上功耗傳感器或英特爾RAPL[5]獲取處理器的功耗并通過處理器的狀態寄存器來讀取性能事件計數器的值?;谛阅苁录嫈灯鞯墓念A測方法無需添加硬件資源,因為性能事件計數器已經集成在了CPU 中。但是這種方法也有明顯的缺點。首先,因為性能事件計數器最初是為監控處理器性能而設計的,有些性能事件與功耗關系不大,導致可供選擇的性能事件較少。其次,性能事件計數器的數值變化與實際電路翻轉并不同步,因此基于性能事件計數器的功耗估算方法必須使用更長的采樣間隔才能達到需要的精度。目前,基于性能事件計數器的功耗預測方法的采樣間隔都在200 ms 以上。

1.2 基于電路信號的功耗預測方法

基于電路信號的功耗預測方法通過仿真工具獲得訓練集的功耗數據,同時通過波形變化文件獲得處理器中每個時鐘周期的電路信號變化情況,然后使用特征選擇方法篩選合適的電路信號來構建功耗模型[6-9]。

基于電路信號的功耗預測方法通常應用于基于現場可編程門陣列(field programmable gate array,FPGA)的功耗模擬中。設計者可以在設計階段使用相對短的訓練程序訓練出來一個基于電路信號的功耗模型,隨后在FPGA 驗證平臺運行更長的測試程序,并讀出相應電路信號的翻轉次數,進而估算出處理器運行這些程序時的功耗值,用于進一步的參數調優。這類方法也可望被用于電壓驟降的實時檢測,電壓驟降現象是指處理器在短時間內負載突然增加帶來電流上升,進而引發處理器供電電壓下降?;陔娐沸盘柕墓念A測模型可以達到時鐘周期級的預測精度,可以通過感知電路信號翻轉頻率的增加速度來判斷處理器中是否發生了電壓驟降,并及時通知供電模塊抬高供電電壓,使電路狀態保持穩定。

基于電路信號的功耗預測方法有2 個缺點。首先,基于電路信號的方法為了實現時鐘周期級的準確度,通常需要篩選出數百個電路信號來構建功耗模型,受限于功耗管理模塊的數據處理能力和較高的硬件資源開銷,很難將這種方法應用于硅后的實時功耗估算。其次,由于片上走線和計算邏輯的延遲,基于電路信號方法估算出來的功耗值在4~5 個時鐘周期后才會被功耗管理模塊讀出。較長的讀出延遲抵消了這類方法的時鐘周期級的精度。

1.3 本文的研究動機

隨著處理器功耗技術的發展,近幾年出現了管理精度在100 μs 粒度內的功耗管理策略[10]。為了適應這種變化,現代處理器必須減少實時功耗估算的采樣時間,以達到對處理器功耗變化的更細粒度的感知。

現有的基于性能事件計數器的功耗估算方法不適用于更細粒度的功耗估算,因為性能事件計數器的變化與實際電路翻轉不同步,隨著采樣間隔的縮短,此類方法的預測誤差也會增大。與此同時,由于硬件開銷很高,基于電路信號的功耗預測方法也缺乏實用性。即使設計人員可以承受較高的硬件開銷,由于CPU 和功耗管理模塊之間存在異步時鐘,時鐘周期精確的功耗數據并不能被功耗管理模塊完整接收。此外,每時鐘周期的數據會超出處理器的功耗管理模塊的計算能力(功耗管理模塊一般是一個微控制器,每時鐘周期只能處理一條指令)。

基于性能事件計數器的功耗預測方法的主要劣勢是它與實際電路信號變化的不同步,與此同時,基于電路信號方法選擇出來的電路信號可以與電路同步變化。與性能事件相比,電路信號與處理器功耗的關系更為直接,可選擇的電路信號也更多。既然基于性能事件計數器的功耗預測方法可以使用8~16 個性能事件構建出一個預測誤差在5%左右的功耗模型,本文認為選擇相同數量的電路信號可以建立比基于性能事件計數器的功耗預測方法更準確的功耗模型。如果將這些電路信號的變化定義為硬件事件,處理器設計者可以通過硬件機制讀取這些事件的計數,然后使用與性能事件計數器類似的方法實時計算功耗,就可以在增加少量硬件資源的情況下大幅提高處理器實時功耗估算的采樣密度。因此,本文引入了功耗事件來記錄這些電路信號的變化,并提出基于功耗事件計數器的實時功耗預測方法。由于本文工作的出發點不是建立一個時鐘周期級的精確功耗模型,所以相對于基于電路信號的功耗預估方法,本文在模型構建方法上進行了一些創新,在減少仿真時間的同時提高了模型的精度。

表1 展示了本文提出的方法與現有方法的比較。本文提出的基于功耗計數器的功耗預測機制可以使用較低的硬件開銷來實現納秒級的處理器功耗預測,能夠更好地適應越來越細粒度的處理器功耗管理策略。

表1 本文提出的方法與現有方法的比較

2 本文提出的方法

圖1 展示了本文提出的方法的整體框架。它的模型構建流程與APOLLO[6]類似,功耗估算方法與基于性能事件計數器的方法相同。

圖1 本文提出的方法的總體框架

流程的第一步是構建出合適的訓練程序,在這一步需要構建出一個能夠盡量調動CPU 所有部件的訓練程序,這樣就可以保證訓練集中包含了處理器中所有可能的功耗模式。隨后仿真得到處理器中所有信號的波形變化文件,并進行預處理。然后對這些波形變化文件進行剪枝和聚類,篩選出一些具有代表性的程序片段及其對應的電路信號翻轉數。接著使用綜合工具生成反標網表[11],隨后通過功耗仿真工具計算出上一步篩選出來的程序片段的功耗值。最后篩選出8~16 個電路信號,并且使用這些信號構建出一個準確的功耗模型。本文還設計了功耗計數器的硬件結構、功耗計數器的讀出機制和功耗預測值的計算方式。

2.1 訓練數據的預處理

仿真工具收集到的波形文件是VCD 格式[12]。VCD 格式包含變量定義段和數值變化段。

圖2 是一個VCD 格式文件的示例,它在變量定義段定義了ASCII 符號代表的電路信號,在隨后的數值變化段描述了各個時刻這些電路信號的變化。本文首先對VCD 文件進行預處理,使用稀疏矩陣的形式來記錄波形的變化。

圖2 VCD 文件格式的示例

本文將VCD 文件中信號的ASCII 碼從0 開始編號,并將此編號作為波形變化矩陣的橫坐標,以VCD 文件中記錄的波形變化的時間作為縱坐標。并且將VCD 文件中記錄的所有的數值都抽象為一次變化。

圖3 展示了訓練集數據的存儲結構,本文將訓練集數據存儲為矩陣形式,其中橫坐標表示程序片段的開始時刻,縱坐標是各個電路信號,矩陣中存放的數值表示的是給定電路信號在某個片段內的翻轉次數。

圖3 訓練集數據存儲結構示例

2.2 訓練集的剪枝

訓練程序片段的功耗仿真和最終的信號篩選均需要花費較長時間,對訓練集進行剪枝可以縮短上述時間。本文從3 個方面對訓練集進行剪枝。

首先,處理器流水線中的許多信號在時間序列上是相互關聯的。例如,前一級流水線的控制流將在下一個時鐘周期轉移到下一級流水線。如果將訓練集的波形中固定間隔內的電路信號翻轉總數累加在一起,這些固定間隔內的電路信號翻轉總數將會反映電路信號在時序上的相關性,使信號選擇算法可以篩選出更具有代表性的電路信號,提高模型的準確度。由于處理器中的各個功能模塊的流水線一般都不會超過8 個時鐘周期,所以本文以8 個時鐘周期為基本單位切分訓練程序,并使用每個片段內信號變化的總和組成訓練集中的電路信號翻轉數據,每個片段的平均功耗構成訓練集中的功耗數據。

其次,當同一個處理器運行相似的程序時,每個程序的功耗也是相似的。例如,算術運算和邏輯運算在處理器的邏輯運算單元中具有相似的波形。兩個程序的電路信號行為相同,因此功耗也很接近。如果訓練程序中有許多相似的指令片段,只需要將這些相似片段中的一段加入訓練集就可以保證訓練集的覆蓋率。本文將各個程序片段內所有電路信號的變化次數作為一個一維向量,即圖3 中的列向量,計算這些向量之間的曼哈頓距離,將曼哈頓距離較小的時間片段分到相同的組中,并在每個組中隨機取一個時間片段用于構成最終的訓練集。

最后,處理器中有一些電路信號有相似的行為。例如,一個模塊的控制流和數據流經常是同步變化的,在這種情況下,只需要保留其中一個控制流信號的電路行為就可以用它來代表該模塊的控制流和數據流信號的變化。因此,本文還從電路信號維度進行層次聚類分析,將電路信號在各個訓練集片段內的變化次數作為一個一維向量,即圖3 中的行向量。本文將具有高皮爾遜相關系數的電路信號聚類在同一組中,隨后在每組中選擇一個電路信號,并提取這些信號的訓練集數據用于下一步的特征選擇。

2.3 性能事件自動篩選算法

本文采用剪枝和松弛過程來進行特征選擇,使用正定LASSO 算法來承擔剪枝任務,使用線性回歸進行松弛。

LASSO 算法[13]是一種同時進行特征選擇和正則化的回歸分析方法。它使用L1 正則項來實現稀疏性。式(2)展示了LASSO 算法,其中N是篩選出來的訓練集片段的數量,M是候選電路信號的數量,y[i] 是第i個訓練集片段的功耗,p[i] 是第i個預估的功耗,wj是第j個電路信號的權重信號,正則項Pregular(wj)=λ| wj|。在LASSO 算法中,所有非零的權重都會受到正則項的影響,所以大多數參數的權重會趨向零,只有少數與觀測值相關性比較大的變量的權重會是非零的。隨著正則項中的λ值的增加,權重中的非零值的數目會隨之減少。

正定LASSO 算法將權重小于0 的正則項設置為正無窮。因為電路的翻轉必然會導致功耗的增加,因此篩選出來的電路信號的權重必須為正。如果存在負權重,就說明模型中選擇的信號之間存在多重共線性。式(3)顯示了正定LASSO 的正則項。正定LASSO 可以通過近端梯度下降法[14]快速求解。

篩選出合適的電路信號后,本文使用線性回歸方法來獲得更精確的權重并構建功耗模型。

2.4 功耗估算機制

圖4 展示了本文提出的功耗估算機制。它包括電路信號翻轉檢測、T個時鐘周期內的翻轉計數和最終的功耗計算。與基于電路信號的功耗估算方法相比,本文提出的方法可以顯著降低硬件開銷。

本研究以離子液體為反應介質,通過在溶解的纖維素溶液中加入氯乙酰胺和四氧化三鐵,制備磁性纖維素。紅外、掃描電鏡和透射電鏡等表征結果表明,氯乙酰胺及Fe3O4均成功負載于纖維素上。所制得的磁性纖維素具備鮮明的層狀結構和磁性性能,這有利與提高對亞甲基藍的吸附能力。

圖4 本文提出的功耗估算機制

電路信號翻轉的檢測機制分為3 種情況:直接使用一個單比特電路翻轉檢測器檢測單比特信號的翻轉;對多比特的信號,使用多個單比特電路翻轉檢測器來檢測每個比特位的變化并做歸約或;最后使用時鐘門控的使能信號表示一個被時鐘門控控制的電路信號的翻轉。

本文使用功耗計數器來記錄一段時間內電路信號的翻轉次數。每當對應的電路信號翻轉時,功耗計數器就會增加1。本文為每個功耗計數器分配16比特寄存器,它可以支持最高65 536 個時鐘周期的讀取間隔。這樣僅需要256 比特的寄存器開銷就可以同時記錄16 個功耗計數器。每隔一段時間,功耗計數器的值會被復制到CPU 的接口緩沖區中,同時將功耗計數器清零。

在功耗估算的過程中,功耗管理模塊從CPU 接口讀取功耗計數器的值,并乘以它們對應的權重,得到上一段時間的處理器功耗,使用這個結果作為下一個時間片段的功耗預測值。各個功耗計數器的權重會被集成到功耗管理模塊的固件中。在硬件實現中,需要根據功耗管理模塊的實際處理能力來設置采樣周期,以確保功耗管理模塊可以在一個采樣周期內計算出CPU 的功耗。為了提高功耗管理模塊的處理能力,可以為功耗管理模塊增加對16 比特向量運算的支持。

3 結果與分析

本文在龍芯GS364 平臺中實現前文提出的方法。龍芯GS364 是一款擁有3 個發射隊列的亂序處理器[15],該處理器中有超過22 萬個電路信號。

本文首先構建合適的訓練程序。訓練程序包括dhrystone、簡單算術指令、向量算術指令、一級指令緩存缺失、一級數據緩存缺失、二級緩存缺失以及特權態指令,這些訓練程序可以覆蓋到處理器的各個模塊。隨后本文使用VCS[16]獲得的原始的電路信號翻轉的訓練數據集,這個數據集中包含了123 520個時鐘周期內的所有的電路信號翻轉信息。

本文利用Python 中的NumPy 庫開發用于對訓練數據集進行剪枝的程序[17]。剪枝程序首先將前一步生成的波形劃分為15 440 個8 時鐘周期長的程序片段,然后分別在信號維度和時間片段維度進行層次聚類分析。在2 次層次聚類分析之后,訓練數據集中只保留了7 858 個程序片段和19 560 個電路信號,與原先數據集中的123 520 個程序片段和超過22 萬個電路信號相比,程序片段減少了98.5%,電路信號數量減少了91.1%。隨后本文使用PrimeTime[18]來獲得這7 858 個程序片段的功耗值。本文在英特爾至強Platinum 8280 處理器中運行PrimeTime,使用平均值模式分析一個程序片段的功耗耗時約6 min,如果使用64 進程并行分析,獲得訓練集的功耗數據需耗時12.27 h。如果不進行數據剪枝的話,就需要15 臺服務器同時進行64 進程并行分析才能在同樣的時間內完成功耗仿真。

本文使用第2 節中提出的算法篩選出合適的電路信號來構建功耗模型。本文比較了正定LASSO和APPOLLO 中使用的極小化極大凹懲罰(minimax concave penalty,MCP)算法,其中在MCP 中設置γ=10,結果如圖5 所示。當λ較小時,MCP 篩選出來的電路信號數量要比正定LASSO 的多,但是λ增加后,2 種算法的代理數量同時下降到20 以下。2種篩選算法篩選出來的電路信號數量同步下降到12、5、2,并且篩選出了完全一致的信號。因此,如果只需要篩選出少量的電路信號來構建功耗模型,2種算法的最終結果是相同的。但是在運行速度方面正定LASSO 較MCP 方法有優勢。本文對比了使用正定LASSO 和使用MCP 方法篩選電路信號的速度,正定LASSO 可以在55 min 完成信號的篩選,而MCP 方法則需要94 min。

圖5 正定LASSO 與MCP 方法的信號篩選能力比較

在使用正定LASSO 算法篩選出合適的電路信號之后,本文使用線性回歸方法重新計算了篩選出來的電路信號的權重,用于最終的模型。本文比較了正定LASSO 算法和線性回歸方法的預測準確性。如圖6 所示,線性回歸方法在所有規模的模型中的預測準確度都優于正定LASSO 方法。

圖6 線性回歸與正定LASSO 生成的模型的誤差比較

隨后本文調整λ的值,選擇16 個功耗計數器,使用線性回歸構建功耗模型。隨后構建與訓練集不同的另一組測試程序來評估功耗模型的誤差。使用該模型預測8 個時鐘周期長度片段的功耗時,模型的預測誤差為5.866%。本文在8 個時鐘周期到512 個時鐘周期的預測區間內以8 個時鐘周期的步長依次評估該功耗模型的預測誤差。結果表明,預測間隔越長,預測誤差越小,本文構建的功耗預測模型在512 個周期的預測誤差為0.830%。如圖7 所示,本文還比較了12 個功耗計數器和6 個功耗計數器的情況。12 個功耗計數器在512 時鐘周期時的誤差為1.576%。當選擇6 個功耗計數器時,功耗模型的預測誤差偏大,而且無法通過增加預測間隔來收斂。由于APOLLO 方法的訓練集程序沒有將電路信號之間的時序相關體現出來,所以它的功耗預測精度比本文提出的方法要低。

圖7 采樣時間對于不同功耗計數器的預測誤差的影響

最后,本文在龍芯GS364 處理器核中實現了16個功耗計數器的硬件代碼,并為每個篩選出來的電路信號增加了2 個周期用于片上走線延遲。隨后使用DC(design compiler)[19]來評估這些更改的硬件開銷。評估結果表明,增加16 個功耗計數器帶來的面積開銷是整個CPU 面積的0.063%。

本文對比了本文篩選出來的功耗事件與使用基于性能事件計數器的功耗模型選擇出來的性能事件。使用本文提出的方法選擇出來的一些與功耗關系密切的信號包括通用寄存器重命名模塊的odest選擇信號、條件寄存器重命名模塊的時鐘門控信號、定點發射隊列的讀隊列項使能、通用寄存器重命名模塊的ldest 信號、一級指令緩存失效隊列的時鐘使能信號、主流水線的時鐘門控信號、取指模塊的nextpc 信號、一級數據緩存失效隊列的時鐘使能信號,一級指令緩存的讀信號、一級數據緩存的讀信號、Page Table Walker 的時鐘門控信號、浮點模塊的時鐘門控信號、一級指令緩存的時鐘門控信號。與之對比,本文使用基于性能事件的方法在幾個型號的龍芯處理器中篩選出來的與功耗相關度比較高的性能事件有處理器的執行周期數、處理器提高的浮點指令數目、處理器前端阻塞周期數、處理器取指隊列滿的周期數、定點指令發射數目、一級數據緩存失效數、硬件預取請求次數、處理器取指次數等。

這2 種方法篩選出來的事件有著明顯的不同,使用本文提出的方法篩選出來的功耗事件更貼近于電路的行為,例如本文篩選出來的信號有一半左右都是各個模塊的時鐘門控信號,其余的非時鐘門控信號也反映的是處理器中某個模塊是否處于工作狀態。而基于性能事件計數器的功耗模型篩選出來的信號則大部分反映宏觀的性能數據,例如提交的各類指令的數目,因為處理器中一條指令的生命周期可能會持續數千個時鐘周期,甚至還會出現分支預測錯誤造成的指令取消,所以使用指令提交數無法達到細粒度的功耗估算。

值得注意的是,本文提出的方法篩選出來的信號與基于性能事件方法也有重合度比較高的信號,例如基于性能事件方法的處理器取指次數和基于本文方法篩選出來的nextpc 信號的變化就是同步的。這說明如果定義好了適當的與功耗更加相關的事件,使用之前的基于性能事件的硅后建模方法也可以將這些信號篩選出來,所以使用本文提出的方法篩選出來的功耗計數也可以在硅后與基于性能事件計數的功耗建模方法結合在一起,這可以為本文提出的方法帶來更多的靈活性。

4 結論

本文提出了一種基于功耗計數器的實時功耗估算方法,它結合了基于性能事件計數器和基于電路信號的方法的優點,僅僅增加少量的面積開銷,就可以在200 ns 級別的時間間隔內達到小于1%的預測誤差。在下一步的工作中,需要在真實芯片中測試本文提出方法的準確性,并且評估靜態功耗對于準確性的影響。

猜你喜歡
計數器功耗時鐘
基于任務映射的暗硅芯片功耗預算方法
采用虛擬計數器的電子式膜式燃氣表
別樣的“時鐘”
古代的時鐘
揭開GPU功耗的面紗
有趣的時鐘
數字電路功耗的分析及優化
時鐘會開“花”
計數器競爭冒險及其處理的仿真分析
IGBT模型優化及其在Buck變換器中的功耗分析
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合