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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 利用圖形化平臺開發(fā)多核嵌入式系統(tǒng)

          利用圖形化平臺開發(fā)多核嵌入式系統(tǒng)

          ——
          作者:NI公司技術(shù)市場工程師 湯敏 時(shí)間:2007-12-30 來源:電子產(chǎn)品世界 收藏

            、多線程是嵌入式設(shè)計(jì)的未來趨向

            近幾年來,處理器的速度遭遇到了瓶頸。在過去40年里摩爾定律表明,每隔18到24個(gè)月半導(dǎo)體芯片中晶體管的數(shù)量就會增加一倍,而芯片性能也隨之線性增長。過去,芯片生產(chǎn)廠商通過增加處理器的時(shí)鐘速度來提高芯片的性能,如從100MHz到200MHz,再到最近的幾GHz。但是在今天,由于功耗和散熱的限制,提高時(shí)鐘速度來增加性能的方法是行不通的了。芯片廠商開始轉(zhuǎn)向另一種全新的芯片構(gòu)架,就是使單個(gè)芯片具有多個(gè)處理器器核心。使用處理器,程序員們可以完成比使用單核心更多的任務(wù)。

            不可避免的也同樣會遇到在功耗和散熱方面的問題,與PC設(shè)計(jì)領(lǐng)域的同行一樣,工程師也開始考慮轉(zhuǎn)向處理器,以求獲得處理能力、功耗和產(chǎn)品體積等方面的潛在優(yōu)勢。Intel嵌入式和通信集團(tuán)總經(jīng)理Doug Davis指出,在高端通信和醫(yī)療成像等計(jì)算密集型應(yīng)用領(lǐng)域,客戶們已經(jīng)紛紛要求芯片廠商提供具有更長生命周期的多核器件。Intel不久前宣稱,將面向嵌入式計(jì)算市場提供四核處理器。一些數(shù)碼產(chǎn)品廠商亦指出,他們公司轉(zhuǎn)向多核是因?yàn)椤靶枰鼜?qiáng)的處理能力和多線程”。

            對于嵌入式系統(tǒng)而言,多核技術(shù)可以提供更高的處理器性能、更有效的電源利用率,并且占用更小的物理空間,因而具有許多單核處理器無法具備的優(yōu)勢。MIPS科技公司亞太區(qū)副總裁Mark Pittman指出,在嵌入式產(chǎn)品的市場上,許多應(yīng)用可以從多線程流水線執(zhí)行當(dāng)中獲益,整個(gè)系統(tǒng)的性能,由此提高的百分比從60%到300%不等。

            多核、多線程需要全新的編程方法

            要想充分發(fā)揮多核以及多處理器解決方案的潛能,僅僅依靠強(qiáng)有力的芯片是不夠的,還需要采用新的編程方法。微軟公司的軟件設(shè)計(jì)師Herb Sutter說過,對于那些期望最終用戶簡單地將計(jì)算機(jī)升級到更快的處理器,或期望立即看到軟件程序性能提升的開發(fā)者而言,“免費(fèi)午餐結(jié)束了”。簡而言之,在相當(dāng)長的一段時(shí)間里,軟件性能可以輕易地得益于處理器的性能提升,但是現(xiàn)在情況不同了。

            利用多核處理器的編程應(yīng)用是一個(gè)巨大的編程挑戰(zhàn),這是廣為接受的。比爾蓋茨有這樣一段話:“要想充分利用并行工作的處理器的威力,…軟件必須能夠處理并發(fā)性問題。但正如任何一位編寫過多線程代碼的開發(fā)者告訴你的那樣,這是編程領(lǐng)域最艱巨的任務(wù)之一?!?/P>

            多核處理器編程,尤其是多線程編程中存在好幾個(gè)難點(diǎn):首先是并行的思考方式,比如要分辨出哪些任務(wù)是可以同時(shí)執(zhí)行的,這并不是一件容易的事情。

            其次是線程的創(chuàng)建和管理。開發(fā)人員把任務(wù)劃分成多個(gè)并行步驟之后,就要通過線程的方式來實(shí)現(xiàn)。多線程編程是相當(dāng)困難的,很多傳統(tǒng)的編程語言都需要一組新的函數(shù)或結(jié)構(gòu)來創(chuàng)建、同步、加解鎖線程,這意味著工作量的增加。

            與此同時(shí),開發(fā)人員還需要考慮并行代碼段之間哪些資源是不能共享的,比如文件、內(nèi)存、硬件等等,否則會導(dǎo)致資源的沖突和競爭,使得并行線程因等待資源而暫停。此外,如何對復(fù)雜的多線程編程進(jìn)行調(diào)試,以及如何在多核的實(shí)時(shí)系統(tǒng)中保持確定性,都是值得考慮的問題。

            通過圖形化平臺開發(fā)多核嵌入式系統(tǒng)

            由于多線程編程的復(fù)雜性,很多計(jì)算機(jī)方面的專家都在進(jìn)行探索,希望讓編譯器來幫助開發(fā)人員處理并行性問題。如果沒有這種編譯系統(tǒng),開發(fā)人員必須自己來處理并行編程。雙核處理器的多線程編程已經(jīng)是相當(dāng)?shù)膹?fù)雜,如果以后發(fā)展到80個(gè)核,其復(fù)雜度將令開發(fā)人員無法應(yīng)付。對于學(xué)習(xí)計(jì)算機(jī)編程或軟件工程的開發(fā)人員來說,或許文本編程的并行編程機(jī)制并不足以難倒他們,可是對于其他領(lǐng)域的專業(yè)人員,如果他們并不擅長編程,又要使用多核處理器帶來的高性能,那么圖形化的開發(fā)環(huán)境LabVIEW可能是他們的理想之選。

            LabVIEW是一種圖形化數(shù)據(jù)流式編程語言,在嵌入式系統(tǒng)中實(shí)現(xiàn)圖形化,已經(jīng)成為大勢所趨?,F(xiàn)在市場所需的是一種完全的圖形化編程語言,提供足夠的靈活性和功能,以滿足更廣泛應(yīng)用的需求。因此,圖形化系統(tǒng)設(shè)計(jì)的關(guān)鍵因素是圖形化編程。

            LabVIEW是一個(gè)基于數(shù)據(jù)流的圖形化開發(fā)平臺,它提供了直觀、符合工程師思維習(xí)慣的圖形化編程方式和用戶界面。在LabVIEW中,用戶解決工程問題就像是在設(shè)計(jì)他們所熟悉的流程圖一樣?,F(xiàn)代多核處理器使得LabVIEW成為一種更合適的編程工具選擇,因?yàn)樗兄⑿谢硎竞蛨?zhí)行任務(wù)的能力。

            LabVIEW本質(zhì)上是一種并行結(jié)構(gòu)的編程語言。基于LabVIEW的數(shù)據(jù)流特性,如果連線中存在著分支,或者是框圖中有著并行序列,那么后臺的LabVIEW執(zhí)行器將自動地實(shí)現(xiàn)并行化運(yùn)行。當(dāng)我們在程序框圖中通過連線的分岔創(chuàng)建另一個(gè)程序分支時(shí),就可能產(chǎn)生另一個(gè)線程。如果我們創(chuàng)建了多個(gè)循環(huán),那相對應(yīng)的也就創(chuàng)建了數(shù)個(gè)新的執(zhí)行線程。在LabVIEW中,多個(gè)并行循環(huán)會自動分配成多個(gè)線程并分配到多個(gè)處理核上,因而LabVIEW用戶無需對代碼做任何改動,也不需要花時(shí)間學(xué)習(xí)新的編程方式,即可利用多核處理器的性能優(yōu)勢。

            LabVIEW提升多核應(yīng)用程序的性能,從單核到雙核計(jì)算機(jī),理論上講,獲得的性能應(yīng)該是原來的兩倍。但是,與這個(gè)極限的接近程度取決于用戶應(yīng)用程序并行化運(yùn)行的程度。LabVIEW程序員們可以很方便的以并行方式來表示他們的解決方案。在多核處理器上,我們可以方便地實(shí)現(xiàn)應(yīng)用程序的性能改進(jìn),因?yàn)長abVIEW動態(tài)地分配每一個(gè)線程。事實(shí)上,用戶不需要創(chuàng)建特殊的代碼以支持多線程,而是通過最少的編程調(diào)整,并行應(yīng)用便可以獲益于多核處理器。對于普通的LabVIEW應(yīng)用程序而言,如果不考慮多核編程技巧,在不改寫代碼的情況下,與最初的基準(zhǔn)程序相比,可以獲得25%到35%的性能提升。

          {{分頁}}

            圖1是一個(gè)簡單應(yīng)用程序的例子。其中,LabVIEW代碼分支簡化了兩個(gè)分析任務(wù),一個(gè)濾波器操作和一個(gè)快速傅立葉變換(FFT),使它們可以在雙核機(jī)器上并行化執(zhí)行。它首先在單核的模式下(關(guān)掉其中的一個(gè)核)運(yùn)行,然后在雙核的模式下運(yùn)行。因?yàn)檫@兩項(xiàng)任務(wù)都是計(jì)算量很高的,利用任務(wù)并行化獲得的性能改進(jìn)為原來的1.8倍。

          圖1 典型的LabVIEW應(yīng)用程序,展示了數(shù)據(jù)流編程的并行特性

            LabVIEW支持嵌入式實(shí)時(shí)系統(tǒng),前面大部分討論都是針對如何平衡多核、多線程編程的復(fù)雜性,從而提高程序的性能和吞吐量。對于要求更加嚴(yán)格的嵌入式實(shí)時(shí)系統(tǒng),這些考慮同樣適用。在典型的實(shí)時(shí)系統(tǒng)中,通常有一段代碼對執(zhí)行時(shí)間有嚴(yán)格要求,必須以指定速率持續(xù)而可靠地運(yùn)行。同時(shí)也有一些對執(zhí)行時(shí)間沒有嚴(yán)格要求的代碼段,比如用戶界面的數(shù)據(jù)傳輸、數(shù)據(jù)存儲等等。顯然,對于執(zhí)行時(shí)間有嚴(yán)格要求的代碼或循環(huán),應(yīng)用程序必須對它們特別關(guān)照,保證沒有沖突等問題。

            表面上看來,這個(gè)要求對于多核系統(tǒng)是一件非常簡單的事情。只要將對于執(zhí)行時(shí)間有嚴(yán)格要求的代碼與其他代碼隔離,分配到獨(dú)占的處理器核上,就可以保證它不受影響地運(yùn)行。但是,許多實(shí)時(shí)或嵌入式操作系統(tǒng)并不支持在多個(gè)處理核之間的線程負(fù)載均衡,這是因?yàn)樵趯?shí)時(shí)和嵌入式領(lǐng)域的工具往往更關(guān)注性能和確定性,而減緩了對于多核的支持。

            Intel定義了用戶需要評估的軟件四層次來確定多核系統(tǒng)的可用程度。如果所用的應(yīng)用程序庫和設(shè)備驅(qū)動不是為多核而設(shè)計(jì)的,或者操作系統(tǒng)不能夠在多個(gè)處理核上進(jìn)行負(fù)載均衡,那么并行化程序在多核系統(tǒng)上是不能夠運(yùn)行得更快的。

            操作系統(tǒng),作為軟件層次的底層,許多實(shí)時(shí)的操作系統(tǒng)(RTOS)廠商現(xiàn)在還不支持在多個(gè)處理器核間進(jìn)行自動的線程負(fù)載均衡。但是,從表1的表述可以看到,為了讓多核處理器在嵌入式實(shí)時(shí)系統(tǒng)中發(fā)揮出性能優(yōu)勢,在實(shí)時(shí)或嵌入式操作系統(tǒng)中必須支持多核處理器的任務(wù)分配。

            LabVIEW的最新版本將針對多核處理器的自動線程負(fù)載平衡功能引入到實(shí)時(shí)系統(tǒng)之中。

            如果需要更進(jìn)一步的控制或微調(diào)實(shí)時(shí)程序的性能,在 LabVIEW 中, 可以使用定時(shí)循環(huán)結(jié)構(gòu)將各部分代碼分配到指定的處理器核上。這意味著開發(fā)人員可以把執(zhí)行時(shí)間有嚴(yán)格要求的代碼直接映射到專用的處理器核,從而保證這部分代碼不會被中斷,保持其實(shí)時(shí)性。

            結(jié)語

            LabVIEW為多核處理器提供了一個(gè)理想的編程環(huán)境,其數(shù)據(jù)流編程概念能夠更直接地將并行應(yīng)用可視化。LabVIEW自動將并行的程序多線程化,而且它可以指派線程到指定的處理器核,也可以自動平衡線程負(fù)載,從而利用多核架構(gòu)的優(yōu)勢以獲得更好的系統(tǒng)性能。LabVIEW 實(shí)時(shí)模塊可以在實(shí)時(shí)或嵌入式系統(tǒng)中支持多核處理器的任務(wù)分配,幫助開發(fā)人員從真正意義上進(jìn)入嵌入式系統(tǒng)的多核時(shí)代。



          評論


          相關(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); })();