AUTOSAR从入门到精通100讲(六)-Multicore-多核存储优化
? ? ?多核存儲的優化十分重要,在汽車嵌入式領域很多CPU的主頻已經足夠高了,為何其計算能力始終存在缺口,其中一個原因就是多核存儲分配不合理,導致CPU訪存時間過長,訪存操作的等待時延浪費了CPU的計算能力。多核存儲的優化涉及的內容頗多,需要考慮芯片的存儲設計,尋址機制/執行模式,Cache機制,編程設計的規范,操作系統和編譯鏈接等等。本篇先從硬件談起吧。
? ??一、?Chip Memory?layout
? ? ?芯片的存儲分布主要影響的是不同核心對不同存儲區域的訪問效率,我們遵循的原則很簡單就是就近原則。如下圖所示,通常多核芯片中每個核心上都會有臨近的RAM或者PFLASH,甚至設計專用的總線訪問提高效率。這種情況下Core0訪問RAM0和RAM1/RAM2的時間是不一樣,因此一個基本的原則就是全局符號的存放應該考慮不同核心的訪問時延,同時全局變量應該盡可能的減少核間共享,減少為了保護數據一致性,帶來額外的性能損失。車載嵌入式領域的控制器(不包括娛樂系統和智能駕駛系統)代碼通常存儲在PFLASH上,并在PFLASH上直接執行不需要額外加載到RAM中執行,代碼在存放和全局變量的存放一樣,同樣需要考慮不同核心取指的效率,不同核心運行的邏輯盡量獨立,代碼存儲靠近其運行核心。
???? 我們知道讓一個多核系統禁止跨核訪問是不可能也不合理,畢竟有很多業務邏輯涉及多核任務的并行與同步,這種情況下如何考慮變量和代碼的存放?
這個我們會在后續章節討論。
????二、 Cache
????此處為何把Cache單列一節,是因為Cache在提升CPU執行效率方面真的十分重要,但是常常被算法工程師和系統工程師忽略,是一位真正”無名英雄“。嵌入式芯片和個人電腦采用的芯片存儲設計上都是采用層次化的結構,以期達到性價比最高的組合。傳統的車載嵌入式控制器一般就到SRAM這一層,不會有DRAM和硬盤。這樣層次化設計的原理是程序執行的局部化原理,包括空間局部化和時間的局部化。程序在執行過程中,對其代碼和變量的訪問并不是”雨露均沾“,而是呈現局部性。Cache的引入就是為了緩存這些被CPU頻繁訪問的代碼和數據,減少主存的訪問,提高執行效率。Cache的實現為了做到盡量和CPU同頻,因此都是硬件設計實現。代碼的cache和數據的cache可以合并也可以獨立,當前主流的車載嵌入式芯片程序和數據的cache還是獨立的居多。
??? Cache不是免費的午餐,它并不能保證每次訪問主存/PFLASH都能在Cache行中命中,如果沒有命中還是需要再到主存/PFLASH去取數據/代碼,如何讓你的程序具有更高的Cache命中率,這是算法工程師需要考慮的事情。
這個我們會在后續章節繼續討論。
????三、尋址機制/執行模式
????芯片通常具有不同尋址和執行模式,典型就是ARM的芯片,具有ARM指令模式和thumb指令模式,此外還有九種的尋址模式
-
立即尋址
-
寄存器尋址
-
?寄存器偏移尋址
-
寄存器間接尋址
-
?基址尋址
-
?多寄存器尋址
-
?堆棧尋址
-
?塊拷貝尋址
-
?相對尋址
?當然并不是所有的芯片都是如此,我們關注一些共性的東西,比如立即尋址模式,當然有些也叫做絕對尋址模式,這種尋址模式的優點是可以一條指令實現跳轉,執行效率高。此處需要注意的是,有些芯片它并不是所有的地址空間都支持立即尋址,有些只支持芯片低地址空間幾十K區域,還需要考慮編譯器的鏈接腳本,如果你的編譯器無法主動優化尋址方式。鏈接器的工作原理是我們實現多核存儲優化的關鍵,若想利用工具自動實現多核存儲優化,鏈接器的知識必須要有一定的了解。
四、優化目標設定
? ? 傳統汽車嵌入式控制器采用的操作系統幾乎全是實時操作系統(RealTime Operating System),部分功能簡單的控制器甚至可能在“裸奔”。車載嵌入式實時操作系統的典型特征就是基于優先級進行任務調度,操作系統的任務均是預先靜態配置,不支持動態創建任務。這樣的操作系統雖然不如復雜操作系統例如Linux靈活,但是其卓越的確定性和實時性,確實更好的符合車輛功能安全。
?????操作系統管理控制器系統的軟硬件資源,任務是操作系統調度管理的對象,操作系統負責協調CPU的計算資源,CPU執行任務的過程是對任務對應代碼的加載,翻譯和執行,代碼和數據存儲在CPU之外,因此CPU可能需要花費比純粹執行指令本身更長的時間去加載指令和數據,P-Cache和D-Cache就是為了優化這個訪存路徑而引入。操作系統與多核存儲的關系就是體現在一次一次周期性的訪存過程中,除了非周期的中斷以及不可預測的外部觸發,我們基本可以根據操作系統對任務的調度周期,層層分解最終確定每一個函數和每一個變量在不同核上的訪問頻率。
一個多核系統中如何考慮變量和代碼的存放?關鍵在于構造一個存儲優化的目標函數,基于目標函數進行優化迭代,最終達到特定邊界條件下的最優結果。萬丈高樓平地起,多核存儲優化分解到最后就是對每一個函數和全局變量的優化。
五、優化目標計算
此處我們以一個變量的優化為例,討論多核存儲優化的基本思想。假設變量X被三個核訪問,每個核心對X變量訪問的頻率如下?
| 變量 | Core0 -f0 | Core1 -f1 | Core2-f2 |
| x | 100Hz | 20Hz | 50Hz |
在特定的硬件平臺上通過測試可以獲取到不同核心對不同存儲區域訪問的時鐘周期,假設參數如下
| 核心 | RAM0-t0 | RAM1-t1 | RAM2-t2 | Shared?RAM-ts |
| Core0 | 2 | 10 | 10 | 20 |
| Core1 | 10 | 2 | 10 | 20 |
| Core2 | 10 | 10 | 2 | 20 |
在這種理想的假設條件下,我們可以設定目標函數,在單位時間內不同核心對變量X的訪問,累計消耗時鐘周期最小的存儲方案。
| X存儲區域 | Core0 | Core1 | Core2 | Sum |
| RAM0 | 100*2 | 20*10 | 50*10 | 900 |
| RAM1 | 100*10 | 20*2 | 50*10 | 1540 |
| RAM2 | 100*10 | 20*10 | 50*2 | 1300 |
| Shared RAM | 100*20 | 20*20 | 50*20 | 3400 |
我們可以通過解析工程的源代碼,并根據操作系統的調度策略確定函數和全局變量在不同核心的訪問頻率,但是聰明的你一定會發現這種靜態的解析方式并不全面,因為這種方式無法覆蓋通過指針訪問的形式。因此通過調試器(例如勞特巴赫或者UDE等)獲取不同函數和變量在真實硬件上被訪問的頻率,可以作為有效的補充方式,二者整合后的數據更為準確可靠。
六、優化實施與驗證
? ? 當我們經過理論計算,確認X變量存放在RAM0是最優的方案,我們需要進行驗證。函數和全局變量的存放最終需要通過鏈接定位到指定的存儲區域,大概過程如下圖。
???? 經過編譯鏈接,我們會得到優化后的軟件,此時我們將軟件刷入控制器,觀察每一個核心上CPU負載率,與優化前各個核心上COU的負載量對比,驗證優化的效果。? ?
總結
以上是生活随笔為你收集整理的AUTOSAR从入门到精通100讲(六)-Multicore-多核存储优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用户研究:如何做用户画像分析
- 下一篇: 机器学习从入门到精通50讲(四)-实时数