利用圖形化平臺(tái)開發(fā)多核嵌入式系統(tǒng)
多核、多線程是嵌入式設(shè)計(jì)的未來趨向
近幾年來,處理器的速度遭遇到了瓶頸。在過去40年里摩爾定律表明,每隔18到24個(gè)月半導(dǎo)體芯片中晶體管的數(shù)量就會(huì)增加一倍,而芯片性能也隨之線性增長(zhǎng)。過去,芯片生產(chǎn)廠商通過增加處理器的時(shí)鐘速度來提高芯片的性能,如從100MHz到200MHz,再到最近的幾GHz。但是在今天,由于功耗和散熱的限制,提高時(shí)鐘速度來增加性能的方法是行不通的了。芯片廠商開始轉(zhuǎn)向另一種全新的芯片構(gòu)架,就是使單個(gè)芯片具有多個(gè)處理器器核心。使用多核處理器,程序員們可以完成比使用單核心更多的任務(wù)。
嵌入式系統(tǒng)不可避免的也同樣會(huì)遇到在功耗和散熱方面的問題,與PC設(shè)計(jì)領(lǐng)域的同行一樣,嵌入式系統(tǒng)工程師也開始考慮轉(zhuǎn)向多核處理器,以求獲得處理能力、功耗和產(chǎn)品體積等方面的潛在優(yōu)勢(shì)。Intel嵌入式和通信集團(tuán)總經(jīng)理Doug Davis指出,在高端通信和醫(yī)療成像等計(jì)算密集型應(yīng)用領(lǐng)域,嵌入式系統(tǒng)客戶們已經(jīng)紛紛要求芯片廠商提供具有更長(zhǎng)生命周期的多核器件。Intel不久前宣稱,將面向嵌入式計(jì)算市場(chǎng)提供四核處理器。一些數(shù)碼產(chǎn)品廠商亦指出,他們公司轉(zhuǎn)向多核是因?yàn)椤靶枰鼜?qiáng)的處理能力和多線程”。
對(duì)于嵌入式系統(tǒng)而言,多核技術(shù)可以提供更高的處理器性能、更有效的電源利用率,并且占用更小的物理空間,因而具有許多單核處理器無法具備的優(yōu)勢(shì)。MIPS科技公司亞太區(qū)副總裁Mark Pittman指出,在嵌入式產(chǎn)品的市場(chǎng)上,許多應(yīng)用可以從多線程流水線執(zhí)行當(dāng)中獲益,整個(gè)系統(tǒng)的性能,由此提高的百分比從60%到300%不等。
多核、多線程需要全新的編程方法
要想充分發(fā)揮多核以及多處理器解決方案的潛能,僅僅依靠強(qiáng)有力的芯片是不夠的,還需要采用新的編程方法。微軟公司的軟件設(shè)計(jì)師Herb Sutter說過,對(duì)于那些期望最終用戶簡(jiǎn)單地將計(jì)算機(jī)升級(jí)到更快的處理器,或期望立即看到軟件程序性能提升的開發(fā)者而言,“免費(fèi)午餐結(jié)束了”。簡(jiǎn)而言之,在相當(dāng)長(zhǎ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)存、硬件等等,否則會(huì)導(dǎo)致資源的沖突和競(jìng)爭(zhēng),使得并行線程因等待資源而暫停。此外,如何對(duì)復(fù)雜的多線程編程進(jìn)行調(diào)試,以及如何在多核的實(shí)時(shí)系統(tǒng)中保持確定性,都是值得考慮的問題。
通過圖形化平臺(tái)開發(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)付。對(duì)于學(xué)習(xí)計(jì)算機(jī)編程或軟件工程的開發(fā)人員來說,或許文本編程的并行編程機(jī)制并不足以難倒他們,可是對(duì)于其他領(lǐng)域的專業(yè)人員,如果他們并不擅長(zhǎng)編程,又要使用多核處理器帶來的高性能,那么圖形化的開發(fā)環(huán)境LabVIEW可能是他們的理想之選。
LabVIEW是一種圖形化數(shù)據(jù)流式編程語言,在嵌入式系統(tǒng)中實(shí)現(xiàn)圖形化,已經(jīng)成為大勢(shì)所趨?,F(xiàn)在市場(chǎng)所需的是一種完全的圖形化編程語言,提供足夠的靈活性和功能,以滿足更廣泛應(yīng)用的需求。因此,圖形化系統(tǒng)設(shè)計(jì)的關(guān)鍵因素是圖形化編程。
LabVIEW是一個(gè)基于數(shù)據(jù)流的圖形化開發(fā)平臺(tái),它提供了直觀、符合工程師思維習(xí)慣的圖形化編程方式和用戶界面。在LabVIEW中,用戶解決工程問題就像是在設(shè)計(jì)他們所熟悉的流程圖一樣?,F(xiàn)代多核處理器使得LabVIEW成為一種更合適的編程工具選擇,因?yàn)樗兄⑿谢硎竞蛨?zhí)行任務(wù)的能力。
LabVIEW本質(zhì)上是一種并行結(jié)構(gòu)的編程語言?;贚abVIEW的數(shù)據(jù)流特性,如果連線中存在著分支,或者是框圖中有著并行序列,那么后臺(tái)的LabVIEW執(zhí)行器將自動(dòng)地實(shí)現(xiàn)并行化運(yùn)行。當(dāng)我們?cè)诔绦蚩驁D中通過連線的分岔創(chuàng)建另一個(gè)程序分支時(shí),就可能產(chǎn)生另一個(gè)線程。如果我們創(chuàng)建了多個(gè)循環(huán),那相對(duì)應(yīng)的也就創(chuàng)建了數(shù)個(gè)新的執(zhí)行線程。在LabVIEW中,多個(gè)并行循環(huán)會(huì)自動(dòng)分配成多個(gè)線程并分配到多個(gè)處理核上,因而LabVIEW用戶無需對(duì)代碼做任何改動(dòng),也不需要花時(shí)間學(xué)習(xí)新的編程方式,即可利用多核處理器的性能優(yōu)勢(shì)。
LabVIEW提升多核應(yīng)用程序的性能,從單核到雙核計(jì)算機(jī),理論上講,獲得的性能應(yīng)該是原來的兩倍。但是,與這個(gè)極限的接近程度取決于用戶應(yīng)用程序并行化運(yùn)行的程度。LabVIEW程序員們可以很方便的以并行方式來表示他們的解決方案。在多核處理器上,我們可以方便地實(shí)現(xiàn)應(yīng)用程序的性能改進(jìn),因?yàn)長(zhǎng)abVIEW動(dòng)態(tài)地分配每一個(gè)線程。事實(shí)上,用戶不需要?jiǎng)?chuàng)建特殊的代碼以支持多線程,而是通過最少的編程調(diào)整,并行應(yīng)用便可以獲益于多核處理器。對(duì)于普通的LabVIEW應(yīng)用程序而言,如果不考慮多核編程技巧,在不改寫代碼的情況下,與最初的基準(zhǔn)程序相比,可以獲得25%到35%的性能提升。
{{分頁}}
圖1是一個(gè)簡(jiǎn)單應(yīng)用程序的例子。其中,LabVIEW代碼分支簡(jiǎn)化了兩個(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),前面大部分討論都是針對(duì)如何平衡多核、多線程編程的復(fù)雜性,從而提高程序的性能和吞吐量。對(duì)于要求更加嚴(yán)格的嵌入式實(shí)時(shí)系統(tǒng),這些考慮同樣適用。在典型的實(shí)時(shí)系統(tǒng)中,通常有一段代碼對(duì)執(zhí)行時(shí)間有嚴(yán)格要求,必須以指定速率持續(xù)而可靠地運(yùn)行。同時(shí)也有一些對(duì)執(zhí)行時(shí)間沒有嚴(yán)格要求的代碼段,比如用戶界面的數(shù)據(jù)傳輸、數(shù)據(jù)存儲(chǔ)等等。顯然,對(duì)于執(zhí)行時(shí)間有嚴(yán)格要求的代碼或循環(huán),應(yīng)用程序必須對(duì)它們特別關(guān)照,保證沒有沖突等問題。
表面上看來,這個(gè)要求對(duì)于多核系統(tǒng)是一件非常簡(jiǎn)單的事情。只要將對(duì)于執(zhí)行時(shí)間有嚴(yán)格要求的代碼與其他代碼隔離,分配到獨(dú)占的處理器核上,就可以保證它不受影響地運(yùn)行。但是,許多實(shí)時(shí)或嵌入式操作系統(tǒng)并不支持在多個(gè)處理核之間的線程負(fù)載均衡,這是因?yàn)樵趯?shí)時(shí)和嵌入式領(lǐng)域的工具往往更關(guān)注性能和確定性,而減緩了對(duì)于多核的支持。
Intel定義了用戶需要評(píng)估的軟件四層次來確定多核系統(tǒng)的可用程度。如果所用的應(yīng)用程序庫(kù)和設(shè)備驅(qū)動(dòng)不是為多核而設(shè)計(jì)的,或者操作系統(tǒng)不能夠在多個(gè)處理核上進(jìn)行負(fù)載均衡,那么并行化程序在多核系統(tǒng)上是不能夠運(yùn)行得更快的。
操作系統(tǒng),作為軟件層次的底層,許多實(shí)時(shí)的操作系統(tǒng)(RTOS)廠商現(xiàn)在還不支持在多個(gè)處理器核間進(jìn)行自動(dòng)的線程負(fù)載均衡。但是,從表1的表述可以看到,為了讓多核處理器在嵌入式實(shí)時(shí)系統(tǒng)中發(fā)揮出性能優(yōu)勢(shì),在實(shí)時(shí)或嵌入式操作系統(tǒng)中必須支持多核處理器的任務(wù)分配。
LabVIEW的最新版本將針對(duì)多核處理器的自動(dòng)線程負(fù)載平衡功能引入到實(shí)時(shí)系統(tǒng)之中。
如果需要更進(jìn)一步的控制或微調(diào)實(shí)時(shí)程序的性能,在 LabVIEW 中, 可以使用定時(shí)循環(huán)結(jié)構(gòu)將各部分代碼分配到指定的處理器核上。這意味著開發(fā)人員可以把執(zhí)行時(shí)間有嚴(yán)格要求的代碼直接映射到專用的處理器核,從而保證這部分代碼不會(huì)被中斷,保持其實(shí)時(shí)性。
結(jié)語
LabVIEW為多核處理器提供了一個(gè)理想的編程環(huán)境,其數(shù)據(jù)流編程概念能夠更直接地將并行應(yīng)用可視化。LabVIEW自動(dòng)將并行的程序多線程化,而且它可以指派線程到指定的處理器核,也可以自動(dòng)平衡線程負(fù)載,從而利用多核架構(gòu)的優(yōu)勢(shì)以獲得更好的系統(tǒng)性能。LabVIEW 實(shí)時(shí)模塊可以在實(shí)時(shí)或嵌入式系統(tǒng)中支持多核處理器的任務(wù)分配,幫助開發(fā)人員從真正意義上進(jìn)入嵌入式系統(tǒng)的多核時(shí)代。
評(píng)論