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