杭州應(yīng)用聲學(xué)研究所 徐雅南 李恒光 范澤亞
德州儀器公司2010年推出的8核DSP芯片TMS320C6678是目前商用市場上計(jì)算性能最高的DSP之一,已在圖像處理、無線電通信基站、雷達(dá)和聲納等領(lǐng)域得到了一定范圍的應(yīng)用。相比上一代被廣泛應(yīng)用的TS201芯片,其優(yōu)點(diǎn)是硬件規(guī)模大、工作主頻高、對外傳輸能力強(qiáng)和大容量外部存儲(chǔ)空間,缺點(diǎn)是平均內(nèi)存小、架構(gòu)復(fù)雜、共享資源競爭激烈和調(diào)度復(fù)雜。隨著芯片使用的日益頻繁,如何有效優(yōu)化軟件架構(gòu),降低經(jīng)濟(jì)成本,受到了軟件設(shè)計(jì)人員的廣泛關(guān)注。針對該問題,提出了一系列針對TMS320C6678的編程優(yōu)化策略,為實(shí)現(xiàn)資源利用最大化提供了技術(shù)支撐。
TMS320C6678是德州儀器公司2010年推出的8核處理芯片,理論上單核具有128Gb/s(@1GHz)的單精度計(jì)算能力,是目前商用市場上計(jì)算性能最高的DSP(Digital Signal Processer)之一,已在圖像處理、無線電通信基站、雷達(dá)和聲納等領(lǐng)域得到廣泛應(yīng)用。作為上一代被廣泛應(yīng)用的TS201芯片的替代產(chǎn)品,TMS320C6678芯片的優(yōu)缺點(diǎn)明顯,其優(yōu)點(diǎn)是硬件規(guī)模大、集成度高,工作主頻高、操作數(shù)寬度大,對外傳輸能力強(qiáng)和大容量外部存儲(chǔ)空間,缺點(diǎn)是平均內(nèi)存小,架構(gòu)復(fù)雜,共享資源競爭激烈、調(diào)度復(fù)雜以及程序復(fù)雜度高。盡管TMS320C6678(4片)的理論運(yùn)算能力約是TS201(6片)的16倍,但是不合理的軟件架構(gòu)往往使得處理性能得不到有效發(fā)揮。針對該問題,本文提出了一系列編程優(yōu)化策略,為實(shí)現(xiàn)資源利用最大化提供技術(shù)支持。
圖1 C6678處理器架構(gòu)示意圖
TMS320C6678(以下簡稱C6678)是TI公司的8核高速數(shù)字信號處理器之一,支持高速定點(diǎn)和浮點(diǎn)計(jì)算,單核主頻高達(dá)1GHz,擁有獨(dú)立的操作系統(tǒng)和L2SRAM空間,支持通過GPIO響應(yīng)硬件中斷,外部通過EMIF和SRIO實(shí)現(xiàn)高速通信,核間通過消息隊(duì)列和共享內(nèi)存進(jìn)行同步和數(shù)據(jù)共享。C6678架構(gòu)圖和工業(yè)用信號處理板分別如圖1所示,包括:32KB一級內(nèi)存(Cache,L1D,L1P),512KB二級內(nèi)存(本地內(nèi)存,L2)、4MB三級內(nèi)存(共享內(nèi)存,MSMC)和2GB DDR3外掛存儲(chǔ)空間,3個(gè)EDMA控制器(10個(gè)通道)用于片內(nèi)傳輸,4個(gè)SRIO快速串行輸入/輸出接口用于片間傳輸。C6678和TS201的主要參數(shù)對比見表1所示。目前工業(yè)上比較主流的C6678軟件開發(fā)環(huán)境(帶操作系統(tǒng))主要以中電32所的銳華Rede和中科海訊的HaixunIDE為主,兩者雖然風(fēng)格不同,但均滿足同一行業(yè)標(biāo)準(zhǔn),核心能力和傳輸方式一致。
(1)合理使用MSMC區(qū)
C6678芯片8核共享4MB內(nèi)存MSMC區(qū)別于外存DDR3,合理控制EDMA與CPU的訪問方式,可以實(shí)現(xiàn)MSM與L2之間數(shù)據(jù)傳輸?shù)牧汩_銷。建議將頻繁操作的全局變量定義在MSMC,以提高運(yùn)算速度。
注意,兩兩變量做運(yùn)算時(shí),MSMC區(qū)變量的運(yùn)算速度≥分別位于MSMC和DDR3的運(yùn)算速度≥DDR3區(qū)變量的運(yùn)算速度,但是不合理的使用會(huì)弱化MSMC的計(jì)算性能。
(2)優(yōu)先使用“向量”
建議優(yōu)先使用“向量”,不建議執(zhí)行單點(diǎn)、跨步或轉(zhuǎn)置等操作,原因是C6678執(zhí)行Cache刷新的基本單位為“塊”,單點(diǎn)、跨步或轉(zhuǎn)置等操作均會(huì)增加Cache開銷。此外,TI官方提供的基礎(chǔ)數(shù)學(xué)函數(shù)庫包含一系列向量操作函數(shù),可顯著提高運(yùn)算速度。
表1 C6678和TS201主要參數(shù)對比
(3)優(yōu)化操作順序
圖2 CLAPACK函數(shù)庫列表
圖3 并行計(jì)算架構(gòu)示意圖
建議優(yōu)化操作順序,減少多余Cache開銷。當(dāng)CPU操作不同變量時(shí),先將原Cache變量刷回原地址,再將后操作變量刷進(jìn)Cache,因此,盡可能減少反復(fù)的變量切換操作可有效減少多余Cache操作。如:執(zhí)行A、B、C、D求和,執(zhí)行(((A+B)+C)+D)相比執(zhí)行((A+B)+(C+D)),其Cache開銷更少,相應(yīng)地運(yùn)算性能更高。
Intel、AMD等公司針對自己的硬件處理器,Pentium、Xeon、Itanum開發(fā)了諸如BLAS和LAPACK等線性代數(shù)功能、離散傅里葉變化(DFT)以及向量超越函數(shù)(向量數(shù)學(xué)庫/VML),向量統(tǒng)計(jì)函數(shù)(VSL)。MATLAB之所以擁有強(qiáng)大的矩陣運(yùn)算能力,主要是使用了BLAS、LAPACK和MKL等高度優(yōu)化的數(shù)學(xué)矩陣運(yùn)算庫。截止目前比較出名的核心數(shù)學(xué)庫以O(shè)penBLAS、LAPACK和MKL為主。其中,LAPACK提供了Fortran和C語言兩個(gè)版本,本文主要是移植了一套適用C6678處理板的LAPACK的C語言版本——CLAPACK,結(jié)合編譯器O2優(yōu)化選項(xiàng)(軟件排流水,刪除全局共有的表達(dá)式),有效提高C6678的數(shù)學(xué)運(yùn)算效率。
首先,通過開源環(huán)境下載CLAPACK,解壓獲得/SRC、/BALS、/F2CLIBS、/LIB、/INCLUDE、TESTING和/INSTALL目次。再根據(jù)C6678底層宏定義對CLAPCK宏定義稍作修改。最后,利用REDE等開發(fā)環(huán)境自帶的交叉編譯器封裝形成blas.lib、clapack.lib、eig.lib、f2clibs.lib、lin.lib和matgen.lib共6項(xiàng)lib函數(shù)庫,如圖2所示。CLAPACK函數(shù)庫支持多級多類型向量、矩陣運(yùn)算和向量矩陣等上千種復(fù)雜運(yùn)算,彌補(bǔ)了C6678自身高性能函數(shù)庫缺乏的短板,其運(yùn)算速度是普通函數(shù)運(yùn)算的2到5倍。
C6678是一種典型的8核并行計(jì)算處理器。以下給出2種典型的軟件架構(gòu):
(1)并行計(jì)算架構(gòu)。受8核共享數(shù)據(jù)總線和存儲(chǔ)空間限制,當(dāng)并線計(jì)算開銷接近飽和時(shí),8核并線計(jì)算無法將運(yùn)算提高8倍(實(shí)測運(yùn)算速度為6至7倍),此時(shí)建議采用如圖3所示軟件架構(gòu):單核作為對外數(shù)據(jù)傳輸模塊,負(fù)責(zé)片間數(shù)據(jù)傳輸及片內(nèi)數(shù)據(jù)共享(Cache),其余7核作為核心計(jì)算模塊,負(fù)責(zé)片內(nèi)并行計(jì)算并由單核匯總計(jì)算結(jié)果。由于單核同時(shí)負(fù)責(zé)內(nèi)外部傳輸,一般建議單核啟用多線程,分別負(fù)責(zé)外部數(shù)據(jù)接收、內(nèi)部數(shù)據(jù)共享和結(jié)果信息發(fā)送,其中外部數(shù)據(jù)接收、內(nèi)部數(shù)據(jù)共享可以共用一個(gè)線程。
圖4 流水線架構(gòu)示意圖
(2)多核流水線架構(gòu)。通過控制8核流水線訪問DDR3外存,可以避開外存總線競爭,實(shí)現(xiàn)外存數(shù)據(jù)的全帶寬讀取與運(yùn)算的并行,示意圖如圖4。
結(jié)束語:本文論述了TMS320C6678的編程優(yōu)化策略,給出了通用軟件設(shè)計(jì)優(yōu)化手段,為實(shí)現(xiàn)資源利用最大化提供了技術(shù)支撐。