摩爾定律問(wèn)世40余年來(lái),人們業(yè)已看到半導體芯片制造工藝水平以一種令人目眩的速度在提高,Intel微處理器的最高主頻甚至超過(guò)了4G。雖然主頻的提升一定程度上提高了程序運行效率,但越來(lái)越多的問(wèn)題也隨之出現,耗電、散熱都成為阻礙設計的瓶頸所在,芯片成本也相應提高。當單獨依靠提高主頻已不能實(shí)現性能的高效率時(shí),雙核乃至多核成為了提高性能的唯一出路。隨著(zhù)AMD率先打破摩爾定律、終結頻率游戲后,Intel和AMD都開(kāi)始逐步推出了基于雙核、四核甚至八核的處理器,工程師們逐漸投入到基于多核處理器的新型應用開(kāi)發(fā)中去時(shí),大家開(kāi)始發(fā)現,借助這些新的多核處理器,并在應用開(kāi)發(fā)中利用并行編程技術(shù),可以實(shí)現最佳的性能和最大的吞吐量,大大提高應用程序的運行效率。
然而,業(yè)界專(zhuān)家們也同時(shí)認識到,對于實(shí)際的編程應用,多核處理器的并行編程卻是一個(gè)巨大的挑戰。比爾蓋茨是這樣論述的:
“要想充分利用并行工作的處理器的威力,…軟件必須能夠處理并發(fā)性問(wèn)題。但正如任何一位編寫(xiě)過(guò)多線(xiàn)程代碼的開(kāi)發(fā)者告訴你的那樣,這是編程領(lǐng)域最艱巨的任務(wù)之一。”
比如用C++寫(xiě)一個(gè)多線(xiàn)程的程序,程序員必須要非常熟悉 C++,了解如何將C++程序分成多個(gè)線(xiàn)程和并在各個(gè)線(xiàn)程間進(jìn)行任務(wù)調度,此外還要了解 Windows 多線(xiàn)程的機制,熟悉 Windows API 的調用方法和MFC 的架構等等。在 C++ 上調試多線(xiàn)程程序,更是被很多程序員視為噩夢(mèng)。
所以,對于測試測量行業(yè)的工程師來(lái)說(shuō),在傳統開(kāi)發(fā)環(huán)境下要想獲得多核下的效率提升意味著(zhù)大量而復雜的多線(xiàn)程編程任務(wù),而使得工程師脫離了自動(dòng)化測試及其信號處理任務(wù)本身,于是,要想在當前的多核機器上充分利用其架構和并行運算的優(yōu)勢,反而成為工程師們“不可能”完成的任務(wù)。
LabVIEW降低并行編程的復雜性,快速開(kāi)發(fā)并行構架的信號處理應用
幸運的是,NI LabVIEW圖形化開(kāi)發(fā)平臺為我們提供了一個(gè)理想的多核處理器編程環(huán)境。作為一種并行結構的編程語(yǔ)言,LabVIEW能將多個(gè)并列的程序分支自動(dòng)分配成多個(gè)線(xiàn)程并分派到各個(gè)處理核上,讓一些計算量較大的數學(xué)運算或信號處理應用得以提高運行效率,并獲取最佳性能。
我們以自動(dòng)化測試中最常見(jiàn)的多通道信號處理分析為例。由于多通道中的頻率分析是一項占用處理器資源較多的操作,如果能夠讓程序并行地將每個(gè)通道的信號處理任務(wù)分配至多個(gè)處理器核,對于提高程序執行速度來(lái)說(shuō),就顯得尤為重要。而目前,從LabVIEW編程人員的角度來(lái)看,要想獲得這一原本“不可能”的技術(shù)優(yōu)勢,唯一需要改變的只是算法結構的細微調整,而并不需要復雜且耗時(shí)耗力的代碼重建工作。
以雙通道采樣為例,我們需要分別對高速數字化儀的兩個(gè)通道上的數據進(jìn)行快速傅立葉變換(FFT)。假設我們采用的高速數字化儀的兩個(gè)通道均以100 MS/s采樣率采集信號并實(shí)時(shí)分析。首先,我們來(lái)看LabVIEW中對于這一操作的傳統順序編程模型。

圖1. 利用順序執行的LabVIEW代碼
和其他文本編程語(yǔ)言一樣,處理多通道信號的傳統方法是將各個(gè)通道信號按順序讀入并逐通道的進(jìn)行分析,上面基于LabVIEW的順序編程模型很好的說(shuō)明了這點(diǎn),0、1兩通道的數據被按順序讀入后,整合為一路數組,并由一個(gè)FFT函數進(jìn)行信號分析并輸出。雖然順序結構能夠順利地在多核機器上運行,但確不能使得CPU負擔得到有效的分攤,因為即使在雙核的機器上, FFT程序也只能在一個(gè)CPU上被執行,而此時(shí)另一個(gè)CPU卻被閑置了。
實(shí)際上,兩個(gè)通道的FFT運算相互獨立,如果程序能夠將兩個(gè)FFT自動(dòng)分配到一臺雙核機器上的的兩個(gè)CPU上,那么理論上程序的運行效率將提高一倍。在LabVIEW的圖形化編程平臺上,情況正是如此,我們可以通過(guò)并行化處理這兩個(gè)通道來(lái)真正提高算法性能。圖2表示了一種采用并行結構的LabVIEW代碼,從圖形化編程的角度來(lái)看,僅僅是增加了一路并行的FFT函數而已。

圖2. 利用并行執行的LabVIEW代碼
由于數據量越大,信號處理運算在工程應用中所占的處理器時(shí)間就越長(cháng),所以通過(guò)簡(jiǎn)單的程序改動(dòng)將原來(lái)的信號處理程序并行化,可以改善程序性能,減少了總的執行時(shí)間。

圖3. 對于大于1M采樣(100 Hz精度帶寬)的數據塊,并行方式實(shí)現了80%或更高的性能增長(cháng)。
圖3描述了性能隨采集數據塊大?。ㄒ圆蓸訑禐閱挝唬┰龃蠖岣叩木_百分比。事實(shí)上,對于更大的數據塊,并行算法方法確實(shí)實(shí)現了近2倍的性能改進(jìn)。工程師們不需要創(chuàng )建特殊的代碼來(lái)支持多線(xiàn)程,在多核處理器環(huán)境下,只需通過(guò)最少的編程調整,利用LabVIEW自動(dòng)分配每一個(gè)線(xiàn)程到多核處理器的特性,可以方便的實(shí)現信號處理能力的大幅度提升,從而達到了自動(dòng)化測試應用的性能改進(jìn)。
程序性能的進(jìn)一步優(yōu)化
LabVIEW并行的信號處理算法不僅幫助工程師提高程序性能,而且可以更清楚的劃分多個(gè)處理器核在項目中的不同用途。比如,將控制采樣輸入,顯示輸出和信號分析的模塊獨立分開(kāi)。
以HIL(Hareware-in-the-loop)或在線(xiàn)信號處理應用為例。首先,使用高速數字化儀或高速數字I/O模塊來(lái)采集信號,并在軟件中執行數字信號處理算法。然后,通過(guò)另一個(gè)模塊化儀器生成結果。常見(jiàn)HIL應用包括在線(xiàn)數字信號處理(如濾波、插值等等)、傳感器仿真和定制組件模擬等等。
一般來(lái)說(shuō),HIL可以使用兩種基本的編程結構來(lái)完成,單循環(huán)結構和帶有隊列的流水線(xiàn)式多循環(huán)結構。單循環(huán)結構實(shí)現簡(jiǎn)單,對于小數據塊具有較低時(shí)延,但單循環(huán)結構受限于各個(gè)環(huán)節的順序結構而無(wú)法實(shí)現并發(fā)性,例如,由于處理器只能執行一個(gè)函數,在處理數據的同時(shí)就無(wú)法執行儀器IO,所以單循環(huán)結構無(wú)法有效利用多核CPU的優(yōu)勢。相比之下,多循環(huán)結構則能夠更好的利用到多核處理器,從而支持高得多的吞吐量。
對于一項多循環(huán)結構的HIL應用來(lái)說(shuō),可以通過(guò)三個(gè)獨立的while循環(huán)和兩個(gè)隊列結構,實(shí)現其間的數據傳遞。在此情況下,第一個(gè)循環(huán)從儀器采集數據,第二個(gè)循環(huán)專(zhuān)門(mén)執行信號處理分析,而第三個(gè)循環(huán)將數據寫(xiě)入到另一臺儀器。這樣的處理方式,也被稱(chēng)之為流水線(xiàn)式信號處理(pipeline)。

圖4.帶有多個(gè)循環(huán)與隊列結構的流水線(xiàn)式信號處理。
圖4中,最上面的循環(huán)是一個(gè)生產(chǎn)者(Producer)循環(huán),它從一個(gè)高速數字化儀采集數據,并將其傳遞至第一個(gè)隊列結構(FIFO)。中間的循環(huán)同時(shí)作為生產(chǎn)者和消費者(Consumer)工作。每次迭代中,它從隊列結構中接收(消費)若干個(gè)數據集,并以流水線(xiàn)的方式獨立為四個(gè)不同數據塊的內容進(jìn)行7階低通濾波的處理,同時(shí)中間的循環(huán)也作為一個(gè)生產(chǎn)者工作,將處理后的數據傳遞至第二個(gè)隊列結構。最后,最下面的循環(huán)將處理后的數據寫(xiě)入至高速數字I/O模塊。于是,在多核的系統下, LabVIEW能夠自動(dòng)地將上面的程序結構中獨立運行的的不同循環(huán)分配在不同的處理器上,同時(shí),還可以根據CPU的運行情況將中間循環(huán)中四個(gè)數據塊的信號處理任務(wù)也分配在不同的處理器上,實(shí)現了在多核處理器環(huán)境下的性能改進(jìn)。
并行處理算法改善了多核CPU的處理器利用率。事實(shí)上,總吞吐量取決于兩個(gè)因素,處理器利用率和總線(xiàn)傳輸速度。通常,CPU和數據總線(xiàn)在處理大數據塊時(shí)工作效率最高。而且,我們可以進(jìn)一步使用具有更快傳輸速度的PXI(PCI) Express儀器,來(lái)減小數據傳輸時(shí)間。
利用NI強大的并行性計算的優(yōu)勢以及PCIe高速數據流傳輸加上Intel的多核技術(shù),在DELL的PowerEdge 2950八核處理器上,以10KHz(2.56MB/s)的速率同步采樣并處理128個(gè)通道的數據,NI幫助ASDEX Tokamak——德國最先進(jìn)的核聚變裝置,完成了“不可能完成的任務(wù)”——為了保證Tokamak裝置中等離子體的高速穩定的運轉,將其裝置外壁上的88個(gè)磁感應器上的大量數據轉換成64*128個(gè)點(diǎn)格上的偏微分方程組,并同時(shí)在短短的1ms內完成了整個(gè)計算過(guò)程!
正如德國開(kāi)發(fā)負責人Dr. Louis Giannone所說(shuō)的:
“利用LabVIEW編程所完成的并行化應用控制,我們在8核機器上將速度提高了5倍,使得我們成功達到1ms閉環(huán)控制速率的要求!”。