針對復(fù)雜嵌入式應(yīng)用的創(chuàng)新處理器實現(xiàn)方法
——
傳統(tǒng)的應(yīng)對方法是不斷研發(fā)更寬數(shù)據(jù)流、更快頻率的處理器,數(shù)據(jù)寬已經(jīng)由最初的4位、8位、發(fā)展到現(xiàn)在的16位、32位,頻率也由最初的MHz級到發(fā)展到現(xiàn)在的GHz級,相應(yīng)的存儲器容量、速度也在不斷增加。但是繼續(xù)沿著高帶寬、高主頻的摩爾定律方向發(fā)展,工藝上的受限已經(jīng)初顯端倪,更加難以應(yīng)對低功耗、小體積的需求。眾多廠商也意識到,對于新的應(yīng)用而言,速度已經(jīng)不再是唯一因素,提升性能才是更好的選擇。
同一化多核處理器結(jié)構(gòu)
單芯片的多核解決方案是個好的嘗試,也是現(xiàn)在的嵌入式應(yīng)用的熱點之一。InterllaSys公司SEAforth系統(tǒng)芯片是從自已的可擴展嵌入式陣列Scalable Embedded Array (SEA)平臺發(fā)展而來的,與將通用處理器和若干DSP核嵌入單芯片的方法不同,該平臺使用了相同的處理器核,每個核既具有通用處理器的功能,同時內(nèi)部集成高速乘法器,經(jīng)過妥善設(shè)計,就可以把復(fù)雜的計算任務(wù)分配給各個處理器核共同進行。
工作時,可以簡單地指定各個處理器核完成需要執(zhí)行的不同任務(wù)。比如,在三重播放應(yīng)用中,可以讓1個處理器核去管理外接存儲器,讓8個處理器核負責(zé)FFT變換,完成多媒體算法,再用幾個處理器核帶動應(yīng)用系統(tǒng)中的各種I/O子系統(tǒng)(見圖1)。這樣,每個處理器都會專心運行自己的任務(wù),避免了執(zhí)行不同任務(wù)時任務(wù)切換之間的開銷,單個處理器在執(zhí)行流媒體解碼過程中,也不會出現(xiàn)由于處理器等待別的外設(shè)而造成的圖像抖動不暢等現(xiàn)象,同時,我們可以根據(jù)具體的應(yīng)用選擇具有不同數(shù)量內(nèi)核的處理器,極大地增強了設(shè)計和選擇的靈活性。目前在這一體系下,已經(jīng)有40核的處理器解決方案。
本地化RAM/ROM存儲器和時鐘發(fā)生器
當設(shè)計中使用了多個處理器時,存儲器存取的問題就出來了。大多數(shù)多核芯片設(shè)計把幾個處理器核和一個共用存儲器放在一起。這樣做簡化了設(shè)計,因為每一個核只是處理器本身,問題轉(zhuǎn)到多個處理器核如何共同使用一個存儲器,以及存儲器存取的仲裁,這是一個難題。通常用到某種仲裁網(wǎng)絡(luò)或者交叉點切換開關(guān),在只有3個到4個處理器核時,這個方法是可行的。但是,在芯片上需要幾十個處理器核時,共用存儲器的問題變得很復(fù)雜,令人望而卻步。此外,由于越來越多處理器核需要對存儲器進行存取,共用存儲器的效率變得越來越低,很快就成為致命的瓶頸,把多核結(jié)構(gòu)在處理方面的優(yōu)點都淹沒了。
SEAforth多核處理器使用了本地化存儲器設(shè)計,即為每個處理器核設(shè)計了自己的RAM/ROM存儲器。這有兩個好處,一方面避免了存儲器仲裁,也不需要交叉切換開關(guān);另一方面可以分配給每個處理器核所需要的存儲容量。分析典型算法的源代碼,需要的存儲器容量有兩種,一種是1000字節(jié)或者少一些,一種是容量很大,幾兆字節(jié),甚至幾百兆字節(jié)。大多數(shù)應(yīng)用屬于前者,后者則在少數(shù)應(yīng)用中需要,實現(xiàn)上也不切實際。所以SEAforth多核處理器為每一個處理器核都用小一些的本地存儲器,1000字節(jié)的數(shù)量級,用于存放程序源代碼和數(shù)據(jù),ROM中固化每個處理器核的BIOS,再用一個大得多的外接存儲器,作為緩沖存儲器滿足多媒體的需要。
與采用公共外部時鐘的方式不同,SEAforth多核處理器為每個核內(nèi)建一個時鐘--一個簡單的環(huán)形振蕩器。它的速度和硅半導(dǎo)體的速度一樣快,只有在該處理器核工作時,它的時鐘才工作。這種設(shè)計方式為下面介紹的核間通訊提供了可能,同時,任一時刻由于只有部分處理器核在工作也大大降低了功耗。SEAforth多核處理器有很低的功耗水平,每個處理器以1GHz的頻率運行,而40核的整體功耗為250mW。
高效的處理器核間通訊
SEAforth多核處理器允許計算量很大的算法由幾個核協(xié)作完成,這時,不同核問需要大量的交換數(shù)據(jù),通訊方式的優(yōu)劣影響整個系統(tǒng)的性能。
完成一項復(fù)雜的任務(wù)時,傳統(tǒng)的做法是由操作系統(tǒng)自行指定參與的核,離的很遠的核間通訊需要處理器內(nèi)有大量的通訊電路,往往設(shè)計復(fù)雜,效率偏低。在SEAforth多核處理器應(yīng)用中,由工程師自己指定完成特定任務(wù)的處理器核,這需要工程師了解哪些任務(wù)需要交換更多的數(shù)據(jù),然后指定相鄰的核完成這項任務(wù)。對于要求大量訪問核外存儲器的任務(wù),同樣可以指定距離最近的核去完成。
SEAforth多核處理器相鄰的核間通訊通過共用寄存器傳輸,如圖2所示。
通過共用寄存器這種方式避免了沖突電路和優(yōu)先權(quán)網(wǎng)絡(luò)的問題,具體傳輸過程中,傳統(tǒng)的處理方法需要利用讀取、檢測、寫入等狀態(tài)位信息建立握手協(xié)議,耗費的時間多于實際傳送數(shù)據(jù)所用的時間。該處理器由于內(nèi)建一個電路,可以在一個指令周期內(nèi)實現(xiàn)啟動/停止中的處理器核操作,所以實現(xiàn)了無需握手協(xié)議的傳輸。
假設(shè)核A與核B之間傳輸數(shù)據(jù),處理器核A是送出數(shù)據(jù)的核,想把數(shù)據(jù)送到共用寄存器去,如果在寄存器中的數(shù)據(jù)還沒讀取,處理器核A就停下來,一直到處理器核B讀取了寄存器中的數(shù)據(jù)。在同一時刻,處理器核A回來執(zhí)行原來要執(zhí)行的那條指令,即"送出數(shù)據(jù)"。于是,從源代碼的角度看,處理器核A總是認為寄存器是空著的,在等待數(shù)據(jù),沒有必要讀取和檢測狀態(tài)位。處理器核B做的事與之相似。
處理器核B的源代碼總是認為寄存器中一直存放著沒有讀出的數(shù)據(jù)。當它殲始執(zhí)行指令"讀取數(shù)據(jù)",從寄存器中取出數(shù)據(jù)時,如果寄存器中沒有需要讀取的數(shù)據(jù),它也停下來。當新的數(shù)據(jù)在寄存器中出現(xiàn)時,處理器核B便執(zhí)行"讀取數(shù)據(jù)"指令,這條指令把數(shù)據(jù)從寄存器中取出來。同樣,沒有必要讀取、檢測狀態(tài)位,沒有必要將狀態(tài)位置位。
在SEAforth多核處理器中,處理器核不僅可以讀取和執(zhí)行本地ROM和RAM中的指令,它還能夠讀取和執(zhí)行I/O口和寄存器送來的指令(見圖3)。這樣,利用上面的傳輸方式,指令便可以源源不斷地送到共用寄存器,并且直接執(zhí)行,不必把源代碼傳送給本地存儲器。大大加快了執(zhí)行效率。
針對性的精簡指令集
除了硬件設(shè)計上的創(chuàng)新,SEAforth多核處理器使用了為自己量身定制的Forth語言,它不使用大量的寄存器,只用很少的硬件實現(xiàn)。這是因為在編制Forth程序時,是定義新的字,然后用這些字來定義更高級的字,這些新定義的字就是核心字。然后把這些核心字裝在處理器的專用電路中。最后的結(jié)果足處理器核非常小,速度很高。
用核心字實現(xiàn)的指令只有32條。這些指令只用5位就能實現(xiàn),有一些指令只能用于某些場合,這樣就有可能把幾條指令都放在一個不長的指令字中,SEAforth處理器核使用18位的數(shù)據(jù)寬,在一個指令字中就可以放4條指令。像這樣安排的指令可以自動地達到緩存的效果,不需要設(shè)置L1和L2緩存。每取一個指令字時,一下就把4條指令送到處理器核中。例如,循環(huán)了程序的微指令可以全部放在一個18位指令字中。這種結(jié)構(gòu)的指令字如果和自動狀態(tài)信號一起,放到I/O寄存器或者共用寄存器中,取一次指令字,就可以傳送大數(shù)據(jù)塊。
通過T18開發(fā)工具可以實現(xiàn)上述指令的編譯,因為SEAforth處理器每個核都通過自己的I/O和外部連接,并且都有自己的BIOS,所以,應(yīng)用中只需為每個核編寫對應(yīng)的源代碼,不再需要中央操作系統(tǒng)去為每個核分配任務(wù)。
豐富的接口資源和外部器件支持
除了上述這些創(chuàng)新的設(shè)計,SEAforth多核處理器內(nèi)建豐富的接口資源進一步減小了系統(tǒng)體積、增強了應(yīng)用范圍:
評論