卜祥飛,柏正堯,洪田榮,李新慶
(云南大學信息學院,昆明650091)
為了處理日益復雜的實時計算問題,當今的通信系統采用了大量的高性能計算芯片,包括各種CPU,FPGA和DSP。對更高計算速度的需求促使人們相應地提高時鐘頻率,但是受到微電子技術發展速度的制約不可能無限制的提高時鐘頻率,于是人們開始使用多塊DSP芯片并行處理高實時性數據。目前最常見的高性能硬件體系結構是基于總線的分布式多處理器,以其結構簡單、成本相對較低、可靠性高的優點得到很多人的青睞。但是總線是系統的“瓶頸”,一旦系統總線出現故障,將使整個系統受到影響,而且在軟件開發過程中難度較高。更重要要的是如果系統計算能力無法滿足實際需求,硬件部分必須重新設計,成本較高,開發周期長。于是提出一種基于以太網主從模式的多DSP并行計算系統,用以太網作為傳輸媒介代替傳統總線,采用UDP協議進行數據通信,其中主機移植了uclinux操作系統來進行全局任務調度,從機采用ADI公司提供的VDK實時操作系統內核進行數據計算。
并行計算是一種用多臺處理機聯合求解問題的過程,其執行過程是將給定的問題首先分解成若干個盡量相互獨立的子問題,然后使用多臺計算機同時求解它,從而最終求得原問題的解。并行計算的提出是當今人們對快速處理大量復雜數據的迫切需求。首先,對于那些要求快速計算的應用問題,單處理機由于器件受物理速度的限制而無法滿足要求,所以使用多臺處理機聯合求解就勢在必行了;其次,對于那些大型復雜的科學工程計算問題,為了提高計算精度,往往需要加密計算網格,而細網格的計算也意味著大計算量,它通常需要在并行機上實現;最后,對于那些實時性要求很高的應用問題,傳統的串行處理往往難以滿足實時性的需要而必須在并行機上用并行算法求解。設計一個針對要求實時性較高的數據處理系統,它不依賴于傳統的PC或多陣列DSP芯片作為處理器,而是使用可以靈活配置的單個DSP芯片組成一個以太網,在此基礎之上采用UDP協議進行數據通信。通過實驗測試表明,這樣可以得到較高的實時數據處理能力。
uclinux的優點在于它的版權免費、源碼開放、結構緊湊,這為日益增長的應用軟件提供了堅實的基礎。ucLinux是一個全功能的操作系統,支持完整的TCP/IP協議,網絡編程易于實現,這對嵌入式系統來說是很重要的,因為它必須在任何時間任何地點進行計算。系統的服務器端是在BF548開發板上移植了uclinux操作系統,移植步驟如下:
(1)在裝有 linux操作系統的 PC機下建立blackfin交叉編譯環境
(2)移植u-boot
(3)移植uclinux操作系統
所有用到的源代碼可以在 http://blackfin.uclinux.org上免費下載。移植成功后借助uclinux操作系統對socket和多線程編程良好的支持來實現復雜的任務調度。
VDK(Visual DSP Kernel)是ADI公司DSP軟件開發工具Visual DSP的一個重要組成部分,它特別適合用來編寫需要精巧控制代碼的應用程序。某些大型系統可能需要許多算法完成,而每個算法還可能包含許多功能模塊,這就要由控制代碼加以組織。處理器日益強大功能的發揮也需要精巧的控制代碼。基于VDK開發的程序中,這些控制碼是由一個叫“內核”的程序管理的,內核常駐在DSP中。VDK實際上是一種帶API(Application Program Interface)函數庫的實時操作系統內核,特別適合算法的實現,并且屏蔽了嵌入式系統開發過程中的一些硬件細節,在Visual DSP++開發平臺下直接建立VDK/LwIP工程,利用VDK提供的一些socket API函數,實現了UDP客戶端通信。
服務器端軟件運行在已經移植好uclinux操作系統的BF548 EZ-KIT評估板上,服務器端軟件流程圖如圖1所示。首先創建一個socket套接字,使用bind函數進行綁定,在主函數中分別創建兩個線程來完成服務器端數據的收發。線程函數recv_thread()負責接收客戶端的數據,其中調用了socket API函數recvfrom()運行在阻塞模式下,等待接收各個客戶端發送的測試字符串,同時存儲客戶端的地址信息。待所有客戶端準備好之后,利用send_thread()函數向各個客戶端發送數據,該發送過程中調用了sendto()函數。出于調試目的,當所有客戶端的運算結果返回之后,在服務器端把得到的結果打印到終端上輸出,之后再次把新數據發送給各個客戶端。

圖1 服務器端軟件流程圖
客戶端程序的編寫采用了ADI公司提供的VDK+lwIP進行開發,采用這種方式進行開發主要是考慮到客戶端軟件復雜程度遠遠小于服務器端(主要用于運算),而且Visual DSP開發環境已經提供了一個完整的網絡應用程序開發框架,無需手工編寫大量底層代碼。因為客戶端的應用程序主要用于數據運算,過程相對簡單,客戶端軟件流程圖如圖2所示。首先創建一個socket套接字,但無需進行綁定,創建套接字成功之后,向服務器端發送一個測試字符串,表示該客戶端已經準備好接收數據,然后等待服務器端發送來的數據。待需要進行運算的數據接收完整之后開始進行數據運算,再把運算得到的結果發送給服務器端,再次進入等待接收服務器端數據狀態。

圖2 客戶端軟件流程圖
為了驗證這個并行計算系統的性能,設計了一個矩陣乘法運算試驗。假設矩陣A、B、C均是n階方陣,其中A被劃分為n個n階的子矩陣,A、B是將要進行乘法運算的初始矩陣,C存放運算結果,C在運算前為零矩陣。現在假設有Pn個客戶端(n≥2),初始化進程后,各個客戶端的存儲器中存有劃分好的子矩陣A和完整的矩陣B,用于存放局部運算結果的矩陣Ci(2≤i≤n)。然后利用各個客戶端已有的數據進行局部矩陣運算并傳輸數據結果,最后將各客戶端的子矩陣進行匯總,即得矩陣相乘的結果矩陣C。作為對比,又把矩陣相乘在單處理機上進行試驗,即將A矩陣的一行和B矩陣的一列一一做串行運算。理論上來講,除去通信開銷外,并行計算矩陣乘法的速度應該是單處理機進行同一矩陣乘法的2倍(所有處理機的硬件配置相同)。
衡量一個并行計算系統的優劣主要有以下幾點標準:各計算結點負載的均衡性,即應使各計算結點的計算量盡量相同;算法的效率(即計算結點計算能力的利用率)及加速比(即計算速度和計算結點數之間的關系),理想的情況是效率為100%,計算速度和計算結點數成正比關系;算法的容錯性,即在系統中若干計算結點出故障,不會影響計算結果的正確性,好的算法應有強的容錯性。有關參數定義如下:
加速比=單機計算時間/n個計算結點并行計算完成時間;
并行效率=加速比/n;
采用不同節點對1000×1000矩陣做乘法矩陣運算,由于網絡延遲的不確定性,于是對同一結點數進行了5次矩陣運算,取平均值后得到的實驗結果如表1所示。并行計算的運行時間取決于結點計算時間最長的那個。

表1 不同計算結點的實驗結果
客戶端均采用相同的硬件結構,因此運算速度比較接近。通過表中的數據可知,與單個處理機的矩陣運算速度相比,多結點情況下的矩陣運算速度有明顯提高。系統具有很好的可伸縮性,為解決大量實時性數據的處理速度問題提供了新的途徑。
基于以太網的多DSP并行計算系統對大量實時性數據的運算速度有明顯的提高,并且易于擴展。首先移植了uclinux操作系統,在此操作系統基礎之上建立了以太網通信,并移植了并行算法到此操作系統進行試驗,以矩陣相乘為例,得到了較好的處理結果。在下一步的研究工作中,將把并行算法的改進作為提高系統效率的重點。
[1]戴光明,戴曉明.基PVM的微機網絡并行計算及其應用[J].計算機工程與應用,2000,25(4):154 -156.
[2]張新菊,劉羽,韓梟.行劃分的矩陣相乘并行改進及其DSP實現[J].微計算機信息(嵌入式與 SOC),2008,24(7):216-218.
[3]朱美能,李德華,金良海,黃翔.基于多DSP的并行實時視頻處理系統[J].計算機與數字工程,2007,35(8):41-44.
[4]Pierre G Paulin,Chuk Pilkington.Parallel programming models for a multiprocessor SoC platform applied to networking and Multimedia[J].IEEE Transactions on Very Large Scake Integration(VLSI)Systems,2008,33(7):667-680.
[5]ADI.Visual DSP++4.5 Kernel(VDK)User’s Guide[M].Analog Devices,Inc.April 2006.