有效利用RTOS編程概念支持先進(jìn)的多線程架構(gòu)
像MIPS技術(shù)公司最新的MIPS32 34K內(nèi)核這樣的多線程架構(gòu)正吸引著越來越多的關(guān)注,這是因?yàn)檫@種架構(gòu)無(wú)需增加太多的芯片資源或功耗即可獲得可觀的性能增益。這種硬件多線程的關(guān)鍵優(yōu)勢(shì)是,它能使用處理器在等待緩沖回填的空閑周期處理其它線程的指令。
使消費(fèi)類設(shè)備應(yīng)用程序適應(yīng)多線程環(huán)境的代價(jià)一般很小,因?yàn)榇蠖鄶?shù)程序已經(jīng)設(shè)計(jì)為成組的半獨(dú)立線程。應(yīng)用程序線程可以分配給處理器中用于處理單線程的專用硬件資源。多個(gè)線程可以被同時(shí)分配給這樣的硬件,并通過共享CPU周期獲得最大的效率。
嵌入式運(yùn)算面臨性能障礙
消費(fèi)類設(shè)備和其它嵌入式計(jì)算產(chǎn)品的制造商正在增加Wi-Fi、VoIP、藍(lán)牙、視頻等各種新的功能,以往功能的增加都要靠大幅提升處理器的時(shí)鐘速度來實(shí)現(xiàn)。臺(tái)式機(jī)的時(shí)鐘速度目前已經(jīng)增加到3GHz以上,即使嵌入式設(shè)備也接近GHz級(jí)。
但在嵌入式應(yīng)用領(lǐng)域,這種方法很快就失去了可行性,因?yàn)榇蠖鄶?shù)設(shè)備的運(yùn)行收到功耗和資源的約束,這些都限制了處理器速度的進(jìn)一步提高。時(shí)鐘周期速度的提高將顯著地增大功耗,因此對(duì)越來越多的嵌入式設(shè)備來說高周期速度將不大可行。另外,處理器速度的進(jìn)一步提高并不能帶來相應(yīng)的性能改善,因?yàn)榇鎯?chǔ)器性能的提高跟不上處理器速度提高的步伐,如上圖1所示。
處理器速度已經(jīng)比存儲(chǔ)器快很多,在許多應(yīng)用場(chǎng)合處理器有一半以上的時(shí)間在等待緩存行(cache line)回填數(shù)據(jù)。每當(dāng)緩存丟失(cache miss)或需要片外存儲(chǔ)器訪問時(shí),處理器就需要從存儲(chǔ)器加載緩存行,將這些字寫進(jìn)緩存,再將舊的緩存行寫進(jìn)存儲(chǔ)器,最后恢復(fù)線程。
MIPS公司指出,每千條指令接受25次緩存丟失(對(duì)多媒體代碼來說是一個(gè)合理的值)的高端可綜合內(nèi)核如果必須等待50個(gè)緩存填充周期,那么將有50%以上的時(shí)間處于停止?fàn)顟B(tài)。由于處理器速度仍在不斷提高,而且比存儲(chǔ)器速度的提高幅度大得多,這類問題將變得越來越突出。
圖1:處理器速度超過存儲(chǔ)器。
多線程技術(shù)
多線程技術(shù)解決了這一難題,它可以利用處理器原本用于等待存儲(chǔ)器訪問的空閑時(shí)間處理多個(gè)并行程序執(zhí)行線程。當(dāng)一個(gè)線程停下來等待存儲(chǔ)器響應(yīng)時(shí),另外一個(gè)線程會(huì)馬上提交給處理器,從而保持運(yùn)算資源的充分利用。
值得注意的是,傳統(tǒng)處理器不能采用這種方法,因?yàn)樗枰罅恐噶钪芷诓拍芡瓿删€程之間的切換。要想使這種方法順利工作,多個(gè)應(yīng)用程序線程必須立即有效,并能逐周期運(yùn)行。
34K處理器是來自面向消費(fèi)類設(shè)備市場(chǎng)的嵌入式處理器主要提供商的首個(gè)多線程產(chǎn)品。每個(gè)軟件線程在線程環(huán)境(Thread Context, TC)上執(zhí)行,一個(gè)TC包括一整套通用寄存器和一個(gè)程序計(jì)數(shù)器(program counter)。
每個(gè)TC都有自己的指令預(yù)取隊(duì)列,所有隊(duì)列都完全獨(dú)立。這意味著內(nèi)核能在線程間逐周期地進(jìn)行切換,因此可以避免軟件中產(chǎn)生開銷。增加更多的TC只需增加很少的額外硅片。TC共享大部分CPU硬件,包括執(zhí)行單元、ALU和緩存。而且,增加一個(gè)TC并不要求CPU擁有另外一個(gè)OS軟件運(yùn)行CPU所需的CP0寄存器拷貝。
一組共享CP0寄存器以及與之相關(guān)的TC即組成一個(gè)虛擬處理單元(VPE)。一個(gè)TC運(yùn)行一個(gè)線程,一個(gè)VPE管理一個(gè)操作系統(tǒng):如果有兩個(gè)VPE,那么就可以有兩個(gè)獨(dú)立的操作系統(tǒng),或一個(gè)SMP風(fēng)格的操作系統(tǒng)。帶一個(gè)TC的VPE看起來就像是傳統(tǒng)的MIPS32架構(gòu)CPU,并且完全兼容MIPS架構(gòu)規(guī)范-其實(shí)就是一個(gè)完整的虛擬處理器。
34K內(nèi)核最多可以有9個(gè)TC和2個(gè)VPE。TC到VPE的聯(lián)系取決于運(yùn)行時(shí)間。默認(rèn)情況下所有準(zhǔn)備執(zhí)行的TC都平等分享處理時(shí)間,但34K內(nèi)核也能在某個(gè)特殊要求線程可能會(huì)“挨餓”的情況下讓某個(gè)程序影響線程調(diào)度,也就是說軟件可以控制每個(gè)線程的服務(wù)質(zhì)量(QoS)。應(yīng)用軟件與硬件策略管理器(Policy Manager)互動(dòng),策略管理器向各個(gè)TC分配動(dòng)態(tài)改變的優(yōu)先級(jí)。然后由硬件分發(fā)調(diào)度器將線程逐個(gè)周期地分配給執(zhí)行單元,從而滿足QoS要求。
在像34K這樣的多線程環(huán)境中,性能可以大大地提高,因?yàn)橹灰粋€(gè)線程處于等待存儲(chǔ)器訪問狀態(tài),另外一個(gè)線程就會(huì)占用空閑下來的處理器周期。上圖2表明了多線程是如何加快程序執(zhí)行速度的。當(dāng)只有線程0運(yùn)行時(shí),13個(gè)處理器周期中只有5個(gè)用于指令執(zhí)行,剩下7個(gè)全部在等待緩存行的回填。在這種使用傳統(tǒng)處理方式的情況下效率只有38%。
圖2:多線程提高了管線效率。
增加線程1就可能使用上述5個(gè)用于等待的處理器周期?,F(xiàn)在13個(gè)處理器周期中用到了10個(gè),效率提高到77%,與最基本情況相比速度加快了一倍。增加線程2后可以完全加載處理器資源,13個(gè)執(zhí)行指令周期可以全部用上,效率達(dá)到100%。相比基本情況速度提高263%。
采用EEMBC性能基準(zhǔn)的測(cè)試表明,34K內(nèi)核與24KE系列產(chǎn)品相比,只用兩個(gè)線程就可以提速60%,而硅片尺寸只增加14%,如圖3所示。
圖3:EEMBC基準(zhǔn)性能例子表明只用兩個(gè)線程性能就有60%的提高。
使軟件適應(yīng)多線程
多線程方法的關(guān)鍵優(yōu)勢(shì)是在大多數(shù)情況下現(xiàn)有軟件只需做極少量的修改就能順利運(yùn)行。大多數(shù)消費(fèi)類設(shè)備程序已經(jīng)寫成一系列的半獨(dú)立線程。每個(gè)線程可以被自動(dòng)或人工地分配給專門的硬件TC。
如果當(dāng)前正在執(zhí)行的線程由于緩存丟失或其它原因引起的時(shí)延而無(wú)法繼續(xù)運(yùn)行,CPU執(zhí)行機(jī)制就會(huì)從那個(gè)TC切換到另外一個(gè)TC,該TC的線程可以在不浪費(fèi)CPU周期的情況下運(yùn)行。程序中線程越多,利用等待存儲(chǔ)器訪問周期的可能性就越高。
多線程處理對(duì)使用或考慮使用RTOS的任何人來說都是非常理想的,因?yàn)?a class="contentlabel" href="http://cafeforensic.com/news/listbylabel/label/RTOS">RTOS程序本身就具有多線程特性。無(wú)需為多線程重新編寫RTOS程序,因?yàn)镽TOS可以在程序控制下自動(dòng)將程序線程映射為TC,其映射方式與將線程映射為傳統(tǒng)處理器的方式相同。
如果線程數(shù)比TC多,通常需要用到傳統(tǒng)的環(huán)境切換(context switch)。這些環(huán)境切換與傳統(tǒng)處理器中的是一樣的。RTOS保存當(dāng)前任務(wù)的狀態(tài),加載另外一個(gè)任務(wù)的環(huán)境并開始執(zhí)行。多線程環(huán)境顯然要比傳統(tǒng)處理器更適合更多環(huán)境的切換,所實(shí)現(xiàn)的環(huán)境切換速度也更快。
Linux/Windows與RTOS的多線程比較
本節(jié)重點(diǎn)介紹相對(duì)Linux和嵌入式Windows版本等操作系統(tǒng)而言快速RTOS的優(yōu)勢(shì)。Linux的典型實(shí)時(shí)性能在數(shù)百微秒到數(shù)毫秒。但在最壞情況下Linux實(shí)時(shí)性能并不理想。而快速RTOS可以提供確定的實(shí)時(shí)性能,在單線程處理器上可以達(dá)1到2毫秒,在多線程處理器上還會(huì)更快。
圖4:將線程映射為TC
RTOS將唯一資源分配給唯一的TC。傳統(tǒng)的做法是將單浮點(diǎn)單元(FPU)分配給TC0。任何執(zhí)行硬件級(jí)浮點(diǎn)運(yùn)算的線程都需要被映射為TC0,因此所有這類線程必須共享TC0。這就形成了多種有趣的編程選擇,特別是用硬件還是軟件實(shí)現(xiàn)浮點(diǎn)運(yùn)算的選擇。
用硬件實(shí)現(xiàn)浮點(diǎn)運(yùn)算顯然速度會(huì)更快,但另一方面需要共享FPU。如果線程只做少量的浮點(diǎn)運(yùn)算,那么用軟件實(shí)現(xiàn)將更有意義,而需要密集浮點(diǎn)運(yùn)算的線程通常要用硬件實(shí)現(xiàn),并被映射到TC0。值得注意的是,這個(gè)修改不需要記錄,因?yàn)槭欠裼糜布蜍浖↑c(diǎn)實(shí)現(xiàn)的決定可以由編譯器切換實(shí)現(xiàn)。
給線程分配權(quán)重
如果程序沒有給各個(gè)線程定義權(quán)重,那么程序調(diào)度器就會(huì)給所有線程分配相同的權(quán)重,另外也可以使用時(shí)間分段技術(shù)使線程依據(jù)用戶指定的權(quán)重共享CPU周期。分配權(quán)重相當(dāng)于將適當(dāng)比例的CPU周期分配給各個(gè)具體線程。線程權(quán)重由RTOS透明地映射為硬件TC。
一些現(xiàn)有程序是針對(duì)傳統(tǒng)處理器設(shè)計(jì)的,其前提條件是假設(shè)在有高優(yōu)先級(jí)的線程準(zhǔn)備好時(shí)低優(yōu)先級(jí)線程將被禁止運(yùn)行。在嵌入式編程環(huán)境中,準(zhǔn)備好的意思是線程運(yùn)行所必需的全部條件都得到了滿足,阻止它運(yùn)行的唯一因素是它的優(yōu)先級(jí)。
多線程可破壞這種條件,因?yàn)闊o(wú)論高優(yōu)先級(jí)線程是否停止,低優(yōu)先級(jí)線程都能運(yùn)行。編寫取消這種狀態(tài)的代碼可優(yōu)化性能。
另外一方面,根據(jù)這種條件編寫的現(xiàn)有代碼無(wú)需修改就能運(yùn)行在多線程處理器上,只需簡(jiǎn)單地設(shè)置操作系統(tǒng)開關(guān),使其只允許相同優(yōu)先級(jí)的線程同時(shí)被加載到TC。在設(shè)置這個(gè)開關(guān)時(shí),需要確保給那些能夠并行運(yùn)行的線程盡量分配相同的優(yōu)先級(jí)。
可中斷的重要性
在傳統(tǒng)的嵌入式應(yīng)用中中斷是非常重要的,因?yàn)樗鼈兲峁┝酥饕?、在許多情況下也是唯一的線程間切換方式。中斷在多線程應(yīng)用中也起著相同的作用,但有一個(gè)重要的區(qū)別,即在多線程應(yīng)用中,線程間的切換不僅要通過中斷,還要使用空閑CPU周期。
需要盡量避免在修改關(guān)鍵數(shù)據(jù)結(jié)構(gòu)時(shí)中斷某個(gè)線程,同時(shí)起用另外一個(gè)線程對(duì)同一結(jié)構(gòu)作其它修改。這將導(dǎo)致數(shù)據(jù)結(jié)構(gòu)處于不一致的狀態(tài),極易引起災(zāi)難性后果。
大多數(shù)傳統(tǒng)應(yīng)用解決這個(gè)問題的方法是,當(dāng)ISR或系統(tǒng)服務(wù)正在修改RTOS中關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)時(shí)暫時(shí)鎖住中斷。這種方法可靠地阻止了任何其它程序跳進(jìn)來對(duì)執(zhí)行代碼正在使用的關(guān)鍵區(qū)域做出不恰當(dāng)?shù)男薷摹?br />
然而在多線程環(huán)境中這種方法是不夠的,因?yàn)橛锌赡鼙磺袚Q到不受中斷鎖定控制的不同TC,從而可能對(duì)關(guān)鍵區(qū)域做出修改。該問題可以利用34K架構(gòu)中的DMT指令解決,當(dāng)數(shù)據(jù)結(jié)構(gòu)在修改狀態(tài)時(shí)可禁止多線程功能。
除了這些相對(duì)簡(jiǎn)單的例外情況外,設(shè)備代碼在從傳統(tǒng)設(shè)備移植到多線程設(shè)備時(shí)無(wú)需修改就能直接運(yùn)行。因此,我們能夠利用以往被傳統(tǒng)RISC處理器浪費(fèi)的CPU周期,充分發(fā)揮多線程性能優(yōu)勢(shì)。多線程可以滿足當(dāng)前和未來需要高性能的消費(fèi)類、網(wǎng)絡(luò)、存儲(chǔ)和工業(yè)設(shè)備應(yīng)用要求,而成本和功耗只有少許的增加。
與主要的競(jìng)爭(zhēng)技術(shù)--多內(nèi)核技術(shù)相比,多線程有更小的硅片面積和更低功耗的優(yōu)勢(shì),而且編程簡(jiǎn)單,現(xiàn)有程序只需做少量修改甚至不用修改就能運(yùn)行。多內(nèi)核方法也有它自己的優(yōu)勢(shì)和強(qiáng)項(xiàng),因此沒有理由證明這兩種方法不能融合出一種最佳方法。在要求高性能、低成本和最小功耗的應(yīng)用場(chǎng)合,多線程是一種極具競(jìng)爭(zhēng)力的方案。
作者:
John A. Carbone
產(chǎn)品行銷副總裁
Express Logic公司
評(píng)論