<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 測試測量 > 設(shè)計(jì)應(yīng)用 > LabVIEW馳騁多核技術(shù)時(shí)代

          LabVIEW馳騁多核技術(shù)時(shí)代

          作者:周斌 NI技術(shù)市場工程師 時(shí)間:2008-09-19 來源:電子產(chǎn)品世界 收藏

            任務(wù)并行化(Task Parallelism)

          本文引用地址:http://www.ex-cimer.com/article/88205.htm

            將整個(gè)程序分成多個(gè)線程來并發(fā)運(yùn)行,是的一個(gè)基本理念,那么通常一個(gè)程序都會由幾個(gè)子任務(wù)組成,例如在某個(gè)測試測量程序中,就可以分為模擬采集和數(shù)字輸出兩個(gè)任務(wù),那么如果我們將這些獨(dú)立的任務(wù)并發(fā)地執(zhí)行在處理器中,那么就自動提高了運(yùn)行的效率。這種將獨(dú)立的幾個(gè)任務(wù)在程序中并發(fā)執(zhí)行的方法,就叫做任務(wù)并行化。

            對于任務(wù)并行化,如何合理地去實(shí)現(xiàn)任務(wù)分配是需要解決的問題。首先,我們可以將本身就互相獨(dú)立的任務(wù)分配在不同線程中,如上例所提到的模擬采集與數(shù)字輸出任務(wù),之間就沒有任何的數(shù)據(jù)連接,因此在中我們就可以并行地將代碼放在程序框圖中,不需要添加任何其他代碼,如圖5所示。

           


          圖5 對獨(dú)立任務(wù)自動實(shí)現(xiàn)“任務(wù)并行化”

            此外,編程中常見的生產(chǎn)者—消費(fèi)者循環(huán)也是一種任務(wù)并行化,在下我們可以將生產(chǎn)者(讀取數(shù)據(jù))與消費(fèi)者(分析數(shù)據(jù))分成并行的兩個(gè)任務(wù),任務(wù)之間的數(shù)據(jù)交互可以使用隊(duì)列結(jié)構(gòu)(Queue)來實(shí)現(xiàn),如圖6所示。

           


          圖6 生產(chǎn)者—消費(fèi)者模型實(shí)現(xiàn)任務(wù)并行

            數(shù)據(jù)并行化(Data Parallelism)

            除了可以將程序任務(wù)進(jìn)行并行化之外,對于一些海量數(shù)據(jù)的處理分析,我們還可以將數(shù)據(jù)分成幾個(gè)可并行操作的小數(shù)據(jù)集,然后分別在各個(gè)核上實(shí)現(xiàn),最后將結(jié)果整合起來作為整體數(shù)據(jù)集的處理分析結(jié)果,這種方式稱為數(shù)據(jù)并行化。

            如圖7(a)所示,一個(gè)大的數(shù)據(jù)集僅僅在一個(gè)核上進(jìn)行處理和運(yùn)算,當(dāng)核1在處理數(shù)據(jù)時(shí),其它的三個(gè)CPU核都處在閑置狀態(tài),整個(gè)系統(tǒng)的運(yùn)行效率很低。

            那么,使用了數(shù)據(jù)并行化之后,如圖7(b),之前的大數(shù)據(jù)集被分割成4個(gè)小數(shù)據(jù)集,并將它們在各自的核上進(jìn)行處理運(yùn)算,最終再將各自的運(yùn)算結(jié)果整合起來作為大數(shù)據(jù)集的處理結(jié)果。經(jīng)過了數(shù)據(jù)并行化之后,整個(gè)系統(tǒng)的運(yùn)算效率有了直線的提升。

           


          (a)

          (b)
          圖7 數(shù)據(jù)并行化

            與“任務(wù)并行化”類似,在LabVIEW下實(shí)現(xiàn)“數(shù)據(jù)并行化”也相當(dāng)?shù)闹庇^與方便,圖8就顯示了一個(gè)矩陣相乘的代碼,程序中將兩個(gè)大矩陣各自分割成小矩陣進(jìn)行相乘,最 后再整合起來,僅僅這樣一個(gè)簡單的改變就可以在一個(gè)雙核處理器上得到0.9倍的性能提高。

           


          圖8  LabVIEW矩陣相乘的數(shù)據(jù)并行化

            流水線式(Pipeline)

            流水線,顧名思義,就是指將一系列的任務(wù)分割成固定的幾個(gè)步驟,然后按照裝配線的方式來執(zhí)行。

            我們以一個(gè)最簡單的汽車裝配線為例,一輛車的裝配完成需要3個(gè)步驟:底盤安裝、零件安裝以及上漆。如果每個(gè)步驟都需要花費(fèi)1個(gè)小時(shí)的話,那么如果一次就裝配一輛車的話,我們需要花3個(gè)小時(shí)來完成(圖9a)。

            那么,如果我們換一種思路,分別對每個(gè)步驟設(shè)立一個(gè)工作站(例如工作站1就專門負(fù)責(zé)底盤安裝,以此類推,如圖9b)。這樣一來,我們看到,當(dāng)一輛車在上漆時(shí),另外一輛車可能正在進(jìn)行底盤安裝。通過這種方式,我們成功實(shí)現(xiàn)了每一個(gè)小時(shí)就能完成一輛車的裝配,是之前裝配速度的3倍。這個(gè)例子中所說的工作站,其實(shí)就可以算作是CPU各個(gè)核,那么通過這種流水線的操作方式,就可以充分利用技術(shù),大大提高整個(gè)程序的運(yùn)行速率。        

           


          (a)

          (b)
          圖9  流水線式編程思路

            而在LabVIEW下實(shí)現(xiàn)流水線式編程也是非常方便,圖10就是一個(gè)最簡單的4個(gè)步驟的流水線式代碼,在一個(gè)For循環(huán)中,并行地執(zhí)行4個(gè)處理步驟,系統(tǒng)將這并行的4個(gè)步驟放在不同的核上運(yùn)行,從而起到“工作站”的作用,實(shí)現(xiàn)了流水線式的編程。

           


          圖10  LabVIEW下實(shí)現(xiàn)流水線式編程

            綜上所述,任務(wù)并行化、數(shù)據(jù)并行化以及流水線式是的三種最常用的方式,相對于以往的順序結(jié)構(gòu),這些編程方式可以在處理器上發(fā)揮更強(qiáng)大的作用,而在LabVIEW下可以很方便地實(shí)現(xiàn)這些編程方式,從而幫助工程師們從多核處理器技術(shù)中得益,提升系統(tǒng)的性能和運(yùn)算速度。

          結(jié)語

            隨著新一代處理器技術(shù)的日益普遍,工程師與開發(fā)人員的一個(gè)必要考慮因素就是他們使用的軟件如何從多核系統(tǒng)中獲得潛在的性能提升。LabVIEW作為天生并行的圖形化編程環(huán)境,可以自動將程序多線程化,避免了開發(fā)人員繁瑣的底層實(shí)現(xiàn),將主要精力投入在高層的編程模式上;而作為的三種常用模式(任務(wù)并行化、數(shù)據(jù)并行化以及流水線式),在LabVIEW下也都能高效地予以實(shí)現(xiàn)。因此,不容置疑的是,隨著具有更多核的處理器不斷涌現(xiàn),LabVIEW將幫助開發(fā)人員真正邁入并行,馳騁多核技術(shù)時(shí)代!

          參考文獻(xiàn):

            1.  劉全周,汪看華,張宏偉,基于LabVIEW和PXI的汽車數(shù)字儀表測控系統(tǒng),電子產(chǎn)品世界,2008.2


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();