TMS320C55x DSP并行處理技術(shù)分析與應用
德州儀器公司(TI)的TMS320C55x(簡(jiǎn)稱(chēng)C55x)DSP內核是在TMS320C54x(簡(jiǎn)稱(chēng)C54x)基礎上開(kāi)發(fā)出來(lái)的,并可以兼容C54x的源代碼。C55x的內核電壓降到了1V,功耗降到0.05mW/MIPS,是C54x的1/6。C55x的運行時(shí)鐘可以達到 200MHz,是C54x的兩倍,再加上C55x在C54x結構上作了相當大的擴展,程序執行時(shí)可以大量采用并行處理,這樣使得C55x的實(shí)際運算能力可以達到300MIPS以上?!?/P>
C55x DSP已越來(lái)越多地應用于各種手持便攜終端當中。以下我們將通過(guò)詳細介紹C55x的CPU內核結構,討論其并行處理技術(shù)的應用。
C55x DSP內核結構
C55x DSP是一款采用改良型哈佛結構,高度模塊化的數字信號處理器擁有比普通DSP更為豐富的硬件資源,能夠有效提高運算能力。其內核結構如圖1所示.
整個(gè)處理器內部分為5個(gè)大的功能單元:存儲器緩沖單元(M單元)、指令緩沖單元(I單元)、程序控制單元(P單元)、地址生成單元(A單元)和數據計算單元(D 單元),各個(gè)功能單元之間通過(guò)總線(xiàn)連接。C55x DSP中有1條32位程序數據總線(xiàn)(P總線(xiàn)),1條24位程序地址總線(xiàn)(PA總線(xiàn)),5條16位的數據總線(xiàn)(B、C、D、E、F總線(xiàn))和5條24位的數據地址總線(xiàn)(BA、CA、DA、EA、FA總線(xiàn))。這種高度模塊化的多總線(xiàn)結構使得C55x DSP擁有超強的并行處理能力。[next]
I單元從程序數據總線(xiàn)接收程序代碼,并將其放入指令緩沖隊列(IBQ)中,然后利用指令譯碼器將指令緩沖隊列中的程序代碼進(jìn)行譯碼,最后再將譯碼后的指令送給P單元、A單元、D單元進(jìn)行處理。
P單元主要是通過(guò)判斷是否滿(mǎn)足條件執行指令的條件來(lái)控制程序地址的產(chǎn)生,達到控制程序流程的目的。程序控制單元中還含有程序控制寄存器、循環(huán)控制寄存器、中斷寄存器和狀態(tài)寄存器等硬件寄存器。通過(guò)循環(huán)控制寄存器的設置,可以直接控制程序中的循環(huán)次數等,而不必像在普通DSP中一樣在外部對循環(huán)條件進(jìn)行判斷,從而可以有效提高運行效率。
A單元的功能是產(chǎn)生讀寫(xiě)數據空間的地址。地址生成單元由數據地址產(chǎn)生電路(DAGEN)、16位的算術(shù)邏輯單元(ALU)和一組寄存器構成。C55x DSP地址產(chǎn)生與其他功能模塊分開(kāi),保證不會(huì )因為地址產(chǎn)生的原因使得單條指令需要在多個(gè)時(shí)鐘周期內完成,提高了DSP的運行效率。A單元中的寄存器包括數據頁(yè)寄存器、輔助寄存器、堆棧指針寄存器、循環(huán)尋址寄存器和臨時(shí)寄存器等。
D單元是C55x DSP中主要的數據執行部件,完成大部分數據的算術(shù)運算工作。它由移位器、40位ALU、兩個(gè)17位的乘累加器(MAC)和若干寄存器構成。數據計算單元的兩個(gè)乘累加器能夠并行使用,可以有效提高DSP運行效率。D單元中的寄存器包括累加器和兩個(gè)用于維特比譯碼的專(zhuān)用指令寄存器。[next]
并行處理基本準則
在C55x DSP指令集中有一些固定搭配的并行執行指令(主要是利用D單元雙MAC結構的并行指令),這些被固定使用的并行指令之間使用“::”符號連接。除了這些固有的并行指令外,用戶(hù)也可以根據CPU結構特征自行定義并行指令,并行的兩條指令之間需使用“||”符號連接,以區分指令集中的并行指令。
用戶(hù)自定義并行指令時(shí),必須遵守如下3條并行處理基本規則:
規則1: 保證不產(chǎn)生硬件沖突,包括操作數、寄存器、總線(xiàn)及各運算模塊的沖突。在對C55x DSP的所有操作中,對P、A、D三個(gè)單元進(jìn)行操作的指令類(lèi)型有14類(lèi),這14類(lèi)操作指令之間有很大一部分可以相互并行運行。經(jīng)過(guò)我們對C55x DSP硬件電路結構的分析,在只考慮硬件模塊沖突的情況下,我們得出如圖2所示的C55xDSP并行處理能力分析圖。圖中將14類(lèi)操作指令組成了一個(gè)14 ×14的矩陣,列出了每一類(lèi)指令與其自身及其他13類(lèi)指令并行執行的能力。圖中畫(huà)有(符號的空格代表不能并行執行,相反沒(méi)有任何符號的空格代表可以并行執行。
在考慮并行處理的硬件沖突時(shí),還需要考慮總線(xiàn)資源的沖突??偩€(xiàn)資源的沖突通常發(fā)生在數據總線(xiàn)和常量總線(xiàn),C55x DSP中含有5條數據總線(xiàn)和2條常量總線(xiàn),各條總線(xiàn)與各運算模塊的連接如圖3所示。
數據總線(xiàn)中,C、D總線(xiàn)是讀數據總線(xiàn),通過(guò)這兩條總線(xiàn)進(jìn)行數據讀??;E、F總線(xiàn)是寫(xiě)數據總線(xiàn),通過(guò)這兩條總線(xiàn)進(jìn)行數據寫(xiě)操作;另外還有一條特殊的B總線(xiàn),這條總線(xiàn)可以進(jìn)行讀或寫(xiě)操作,但是它只能被CDP寄存器使用,而其它輔助寄存器無(wú)法使用B總線(xiàn)。
兩條常量總線(xiàn)分別是KA、KD總線(xiàn)。KA常量總線(xiàn)用于產(chǎn)生地址數據。P單元的KA常量總線(xiàn)負責產(chǎn)生程序地址,例如跳轉指令B #Routine2中,常量#Routine2就是通過(guò)KA常量總線(xiàn)被送到P單元的。A單元的KA常量總線(xiàn)負責產(chǎn)生數據存儲區地址,例如在指令 Mov*SP(#7),Brc0中,偏移量#7就是通過(guò)KA常量總線(xiàn)被送到A單元的。KD總線(xiàn)用于傳送參與運算的常量數據,例如指令ADD #123,AC0中,常量123就是通過(guò)KD總線(xiàn)傳送的。
規則2:受指令緩沖隊列(IBQ)的限制,并行語(yǔ)句的總長(cháng)度不能超過(guò)6個(gè)字節。 I單元中的譯碼器只能將IBQ中的1~6個(gè)字節的程序進(jìn)行譯碼。如果一條并行語(yǔ)句的長(cháng)度超過(guò)6個(gè)字節,則需要在兩個(gè)時(shí)鐘周期內對其進(jìn)行兩次譯碼。因此必須將兩條并行語(yǔ)句的總長(cháng)度限制在6個(gè)字節。
規則3:當需要尋址兩個(gè)及以上數據存儲區數據時(shí),必須使用雙重AR間接尋址方式。
采用雙重AR間接尋址方式,可以通過(guò)使用2個(gè)不同的輔助寄存器(AR0~AR7)同時(shí)訪(fǎng)問(wèn)數據存儲區中兩個(gè)不同的數據。在這種尋址方式下,我們可以通過(guò)兩條不同的數據總線(xiàn),在同一時(shí)鐘周期內尋址兩個(gè)不同數據,并將其輸入不同的運算模塊進(jìn)行計算。
常用并行處理應用
在編程實(shí)現過(guò)程中,對每一個(gè)并行處理都進(jìn)行仔細分析將能達到事半功倍的效果。下面是我們總結出的幾種典型并行處理應用:
1. D單元雙MAC結構的并行處理
在C55x DSP的D單元中采用了雙MAC的結構,其結構如圖4所示。這里有3條數據總線(xiàn)(B、C、D數據總線(xiàn))與兩個(gè)MAC模塊相連。在同一時(shí)鐘周期里,可以同時(shí)通過(guò)3條數據總線(xiàn)將三個(gè)不同地址的數據傳入兩個(gè)MAC模塊中進(jìn)行并行計算。[next]
通常情況下,兩個(gè)MAC模塊的運算總共需要4個(gè)數據,而這里的總線(xiàn)數卻只有3條,所以在并行使用雙MAC結構時(shí),兩個(gè)MAC模塊必須共用一組數據,而另外兩組數據分別分配給兩個(gè)MAC模塊。這使得雙MAC結構的并行應用受到一定的限制。
C55x的雙MAC結構比較典型的應用如不同數據的相同算法處理和同一數據的不同算法處理。下面是對不同數據進(jìn)行相同FIR濾波的實(shí)例:
MAC *AR0+,*CDP+,AC0
::MAC *AR1+,*CDP+,AC1
其中AR0和AR1寄存器分別指向輸入的兩組數據,CDP寄存器指向FIR濾波器的抽頭系數。C55x DSP的指令集中還含有其它與雙MAC模塊并行處理的專(zhuān)用指令,在此就不再仔細分析。
2. 存儲區數據裝載指令與存儲指令的并行
MOV AC0,*AR1
||MOV *AR2,AC1
此例是在D單元內對AC0進(jìn)行存儲并裝載數據到AC1。程序執行時(shí),將數據通過(guò)D總線(xiàn)讀入AC1寄存器,同時(shí)將AC0數據通過(guò)E總線(xiàn)寫(xiě)入存儲器,這樣就避免了硬件沖突,滿(mǎn)足并行規則1。兩條指令總長(cháng)度為4字節,小于IBQ6個(gè)字節的限制,滿(mǎn)足了并行規則2。兩條指令均采用雙重間接尋址,滿(mǎn)足了并行規則3。通過(guò)上機調試,這條并行指令確實(shí)能夠正確編譯并執行。
3. A單元中ALU運算與D單元中ALU、MAC和移位運算的并行
下面我們以一個(gè)實(shí)例來(lái)進(jìn)行說(shuō)明:
ADD T0,AR1
||MOV HI(AC0#18),*AR2
[next]
4. 累加器的移位、飽和及存儲操作與D單元ALU或MAC的并行處理
下面我們以一個(gè)實(shí)例來(lái)進(jìn)行說(shuō)明:
MOV HI(AC0#18),*AR2
||ADD AC0,AC1
這是一個(gè)D單元移位操作模塊與D單元ALU模塊的并行處理實(shí)例。它在移位操作模塊中完成寄存器AC0的移位,然后將移位后的值通過(guò)E總線(xiàn)存儲到存儲器中,同時(shí)在A(yíng)LU模塊中完成寄存器AC0與AC1的加法運算,然后將結果存放于A(yíng)C1。這兩條指令不存在硬件沖突,滿(mǎn)足并行規則1。兩條指令總長(cháng)度為5個(gè)字節,小于IBQ6字節的限制,滿(mǎn)足并行規則2。這里只需使用一個(gè)存儲器中的數據,不需滿(mǎn)足并行規則3。通過(guò)上機調試,這條并行指令能夠正確編譯并執行。
5. 程序控制操作與運算操作的并行
P單元程序控制模塊與其他的算術(shù)運算模塊相對較獨立,不易發(fā)生硬件沖突,便于進(jìn)行并行處理。下面是一個(gè)程序控制指令與算術(shù)運算指令的并行:
ADD *AR2,AC0
||RPTBLOCAL JUMP1 這是一個(gè)D單元ALU模塊與P單元程序控制模塊的并行實(shí)例。它在D單元ALU中將D總線(xiàn)送來(lái)的數據與AC0相加并存入AC0,同時(shí)完成程序循環(huán)控制。程序執行中不存在硬件模塊和總線(xiàn)的沖突,滿(mǎn)足并行規則1;兩條指令總長(cháng)度為5字節,滿(mǎn)足并行規則2;此例只使用一個(gè)存儲器中的數據,不需要滿(mǎn)足并行規則3。通過(guò)上機調試,這條并行指令能夠正確編譯并執行。
6. 使用常量對存儲器進(jìn)行初始化
D單元擁有兩條寫(xiě)總線(xiàn)(E、F總線(xiàn)),在通常情況下我們只使用了其中的一條寫(xiě)總線(xiàn)造成資源浪費。假如我們需要對某塊數據存儲區清零,通常的做法如下:
RPT #9
MOV #0,*AR1+
這段程序對存儲區數據逐一清零,每次只使用了D單元的E總線(xiàn),總共需要10個(gè)時(shí)鐘周期才能完成。在這種情況下,如果我們充分利用E、F總線(xiàn),將有效地降低這段程序的運算量。具體實(shí)現如下:
MOV #0,AC0
||RPT #4
MOV AC0,DBL(*AR1+)
這段程序與上一段的最大不同點(diǎn)在于,一個(gè)時(shí)鐘周期內通過(guò)E、F總線(xiàn)將兩個(gè)初始數據同時(shí)傳送到指定的數據區,同時(shí)初始化兩個(gè)字的存儲空間。這段程序只需要5個(gè)時(shí)鐘周期就可以完成10個(gè)字的初始化,比普通做法節約一半的運算量,提高了使用效率。
評論