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