#NILabVIEW編譯器深層分析_第1頁
#NILabVIEW編譯器深層分析_第2頁
#NILabVIEW編譯器深層分析_第3頁
#NILabVIEW編譯器深層分析_第4頁
#NILabVIEW編譯器深層分析_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、NI LabVIEW 編譯器:深層分析概覽即便對(duì)無足輕重的編程語言來說,編譯器的設(shè)計(jì)往往也是一個(gè)復(fù)雜的課題。即 使對(duì)專業(yè)的軟件項(xiàng)目師們來說,編譯理論也需要考慮專業(yè)知識(shí)?,F(xiàn)代的 NI LabVIEW軟件是一種多范例語言,包括廣泛的多種類型的概念,包括數(shù)據(jù)流, 支持面向?qū)ο?,以及事件?qū)動(dòng)編程。 LabVIEW也覆蓋了各種平臺(tái),服務(wù)多種操 作系統(tǒng) (Windows, Linux, Mac, 多種芯片組 (PowerPC, Intel, 甚至可以服務(wù)于 嵌入式設(shè)備和現(xiàn)場可編程門陣列 (FPGAs,它與傳統(tǒng)的 PC結(jié)構(gòu)有明顯不同。也許 您會(huì)猜想, LabVIEW 編譯器是一個(gè)精密的系統(tǒng),遠(yuǎn)遠(yuǎn)超出一般書面

2、描述的范圍。目錄編譯與解釋LabVIEW 編譯器的歷史回顧當(dāng)今的編譯器DFIR 與 LLVM 協(xié)同工作本專業(yè)論文介紹了 LabVIEW編譯器,簡明地講解了它從 1986年 LabVIEW 1.0版 本開始的發(fā)展變化,并描述了它今天的形式。另外,本文也探究了最近編譯器 的創(chuàng)新,并突出了這些新特點(diǎn)對(duì) LabVIEW的益處以及對(duì)您的幫助。編譯與解釋LabVIEW是一種編譯語言,它令人驚奇,因?yàn)樗谝话愕?G開發(fā)過程沒有任何 明晰的編譯步驟。取而代之的是,您可以對(duì)您的 VI 做出改動(dòng)并簡單地按下運(yùn)行 鍵來執(zhí)行它。編譯意味著您所寫的 G代碼被轉(zhuǎn)化為本地機(jī)器碼然后被主機(jī)電腦 直接執(zhí)行。這種方法可供選擇的另

3、一種途徑是解釋,程序被另外的軟件程序叫做解釋程序)間接地執(zhí)行,而不是直接由電腦執(zhí)行。LabVIEW語言并沒有要求其本身被編譯或者解釋;事實(shí)上, LabVIEW的第一個(gè)版 本使用解釋程序。在后來的版本,編譯器取代了解釋程序以提高 VI 運(yùn)行時(shí)的性 能,這是編譯器與解釋程序相比最常見的區(qū)別。解釋程序更容易編寫,并以較 差的運(yùn)行性能為代價(jià),而編譯器執(zhí)行起來更加復(fù)雜但是卻能提供更快的執(zhí)行時(shí) 間。 LabVIEW編譯器最主要的好處之一就是編譯器對(duì)所有 VIs 的提高顯而易見, 而不必做出任何改變。實(shí)際上, LabVIEW 2018正式版的編譯器進(jìn)行了內(nèi)部優(yōu)化 以加快 VI 的執(zhí)行時(shí)間。/ 16LabVI

4、EW 編譯器的歷史回顧在急于深入討論現(xiàn)在編譯器內(nèi)部組成之前,很值得總結(jié)一下編譯器從 20 年前最 早期版本到現(xiàn)在的發(fā)展。這里介紹的一些算法,例如類型傳播法,聚叢法,以 及內(nèi)嵌法 inplaceness ),在現(xiàn)代的 LabVIEW 編譯器討論中會(huì)更加詳細(xì)地描述。LabVIEW 1.0 版本于 1986 上市。如前面提到的, LabVIEW在其第一個(gè)版本使用 了解釋程序并且僅為摩托羅拉 68000 服務(wù)。那時(shí)的 LabVIEW語言非常簡單,也 減弱了其對(duì)編譯器的需求 當(dāng)時(shí)是解釋程序)。例如,它不存在任何的多態(tài)數(shù)據(jù) 類型,唯一的數(shù)據(jù)類型是擴(kuò)展精度浮點(diǎn)數(shù)據(jù)。 LabVIEW 1.1版本首次引入了內(nèi)

5、嵌 inplaceness )算法,或者稱之為“內(nèi)嵌程序”。此算法支持?jǐn)?shù)據(jù)分配,因 此您可以在執(zhí)行的時(shí)候重新使用數(shù)據(jù),避免了不必要的數(shù)據(jù)副本,相應(yīng)地,常 常能顯著地提高執(zhí)行性能。在 LabVIEW 2.0 版本,解釋程序被當(dāng)前的編譯器所取代。仍然專門為摩托羅拉 68000服務(wù), LabVIEW可以生成本地機(jī)器碼。在 2.0 版本還增加了類傳播算法, 可以在不斷完善的 LabVIEW語言中發(fā)揮其它職能,處理語法檢查與類型解讀。 LabVIEW 2.0 另外一項(xiàng)重大的創(chuàng)新是聚叢程序的引入。聚叢算法支持 LabVIEW 圖表的并行輸入,并將節(jié)點(diǎn)歸類為“叢”,它可以并行運(yùn)行。類傳播算法,嵌 入法 in

6、placeness )以及聚叢算法直到目前也是現(xiàn)代 LabVIEW編譯器的重要組 成部分,并隨時(shí)間的推移顯現(xiàn)出更多的新增改進(jìn)。 LabVIEW 2.5 中新的編譯器 基本結(jié)構(gòu)增加了對(duì)多種后端設(shè)備的支持,尤其是英特爾 x86 與 Sparc 。LabVIEW 2.5 也引入了連接器,當(dāng) VIs 需要被重新編譯的時(shí)候,它可以管理 VIs 路徑之 間的從屬關(guān)系。在 LabVIEW 3.1,除常數(shù)合并外,也增加了兩個(gè)新的后端, PowerPC 與 HP PA- RISC。LabVIEW 5.0 與 6.0 更新了編碼生成程序,并增加了 GenAPI,一種與多 種后端連接的常用接口。 GenAPI交叉編

7、譯對(duì)實(shí)時(shí)開發(fā)來說,是非常重要的。實(shí) 時(shí)開發(fā)者一般在主機(jī) PC 上編寫 VIs ,而將其部署到 將它們編譯到)實(shí)時(shí)對(duì)象。 另外,一種循環(huán)不變代碼移出的有限形式也包含在內(nèi)。最終,LabVIEW多任務(wù)執(zhí)行系統(tǒng)被擴(kuò)展到支持多線程。LabVIEW 8.0 創(chuàng)建的基于 5.0 版本引入的 GenAPI基本結(jié)構(gòu),新增了寄存器分配 算法。在 GenAPI引入之前,每個(gè)節(jié)點(diǎn)的生成碼都是由寄存器硬件編碼的。不可 執(zhí)行編碼的有限形式以及死碼刪除也被引入。 LabVIEW 2009具有 64 位 LabVIEW與數(shù)據(jù)流中間表示 (DFIR。DFIR 立即被用于創(chuàng)建更先進(jìn)形式的循環(huán)不 變代碼移出,常數(shù)合并,死碼刪除以及

8、不可執(zhí)行編碼刪除。 2009 新語言的特點(diǎn), 例如并行循環(huán),都是基于 DFIR 創(chuàng)建。最終,在 LabVIEW 2018,DFIR 提供了新的編譯器優(yōu)化,例如代數(shù)重組,公共子 表達(dá)式消除,循環(huán)展開,以及 subVI 直接插入。此正式版本也包括在 LabVIEW 編譯器鏈中采用了低階虛擬機(jī) (LLVM。 LLVM是一種開放源代碼的編譯器基本結(jié) 構(gòu),廣泛應(yīng)用于工業(yè)生產(chǎn)。使用 LLVM,新增了很多優(yōu)化,例如指令調(diào)度,循環(huán) 外提,指令組合,條件傳播,以及一種更精密的寄存器分配程序。/ 16當(dāng)今的編譯器當(dāng)對(duì) LabVIEW編譯器的歷史有了基本了解后,您現(xiàn)在可以探索現(xiàn)代 LabVIEW的 編譯器了。首先,

9、回顧高級(jí)的多種類型編譯步驟概述,然后更加詳細(xì)地瀏覽每 一部分。一個(gè) VI 編譯的第一步是類傳播算法。這復(fù)雜的一步是為了解讀適于終端輸入的 隱含類型,并檢測語法錯(cuò)誤。在 G編程語言所有可能的語法錯(cuò)誤都在類傳播算 法這一步被檢測。如果算法確定 VI 有效,編譯繼續(xù)。在類傳播后, VI 首先被從結(jié)構(gòu)圖編輯器使用的模型轉(zhuǎn)化為編譯器使用的DFIR。一旦轉(zhuǎn)化為 DFIR,編譯器對(duì) DFIR圖執(zhí)行幾個(gè)變換,分解它 ,優(yōu)化它,并使其 為生成代碼做好準(zhǔn)備。很多編譯器的優(yōu)化例如,內(nèi)嵌程序 inplacer )與叢 聚程序被執(zhí)行轉(zhuǎn)化并在本步運(yùn)行。在 DFIR 圖標(biāo)被優(yōu)化與簡化后,它被翻譯成 LLVM中間表示。對(duì) L

10、LVM一些列的掃 描被執(zhí)行,通過中間表示來進(jìn)一步優(yōu)化并降低其階次,最終變?yōu)闄C(jī)器碼。類傳播如先前提到的,類傳播算法解讀類型并檢測程序錯(cuò)誤。實(shí)際上,此算法包括如 下幾個(gè)方面的功能:解讀隱藏類型使其適于終端輸入解讀 subVI 調(diào)用并確定其合法性計(jì)算縱向檢驗(yàn) VI 的周期檢測并報(bào)告語法錯(cuò)誤此算法在您對(duì) VI 進(jìn)行每個(gè)改動(dòng)后運(yùn)行,以確定 VI 是否仍然完好,因此,這步 是否是“編譯”的真正部分還存在少許爭議。無論如何,它是LabVIEW編譯鏈的一環(huán),非常明顯地相當(dāng)于傳統(tǒng)編譯器的詞法分析,句法分析,或者是語義分 析。一個(gè)適于終端輸入的簡單例子是 LabVIEW加法基元。如果您將兩個(gè)整數(shù)相加, 結(jié)果是整數(shù)

11、,但是如果您將兩個(gè)浮點(diǎn)數(shù)相加,結(jié)果是一個(gè)浮點(diǎn)數(shù)。類似的案例 出現(xiàn)在符合類型的數(shù)據(jù),例如陣列和簇。存在其它語言結(jié)構(gòu),例如對(duì)移位寄存 器來說,有更復(fù)雜的輸入規(guī)則。在加法基元的情況下,輸出類型取決于輸入類 型,類型被叫做通過圖表“傳播”,這也是算法名字的由來。這個(gè)加法基元的例子也表明類傳播算法的語法檢查職能。假設(shè)您連接一個(gè)整數(shù) 和一個(gè)字符串到一個(gè)加法基元會(huì)發(fā)生什么?在這種情況下,將二者的值相/ 16加沒有意義,所以類傳播算法將其報(bào)告為一個(gè)錯(cuò)誤并將 VI 標(biāo)記為“壞的”,它 會(huì)引起運(yùn)行箭頭中斷。中間表示 是什么與為什么在類傳播確定 VI 是有效的,編譯器繼續(xù)并將 VI 轉(zhuǎn)化成 DFIR。一般來說在詳細(xì)

12、 設(shè)計(jì) DFIR之前要考慮中間表示 (IRs 。IR 是由編譯過程通過多階段編輯過的用戶程序的表示。 IR 的概念常見于現(xiàn)代編 譯文獻(xiàn)并能應(yīng)用于任何編程語言。圖 1. AST IR實(shí)例請(qǐng)考慮一些例子。當(dāng)今有多種流行的 IRs 。兩種常見的例子是抽象語法樹 AST) 與三地址碼。t0 - yt1 - 3t2 - t0 * t1t3 - xt4 - t3 + t2表 1.三地址碼 IR 實(shí)例圖 1 顯示了“x + y * 3 ”表達(dá)的 AST表示,而表 1 顯示了三地址碼表示 兩種表示方式之間最明顯的一處不同是 AST是更高級(jí)的。它更類似于程序 (C的 源表示而不是對(duì)象表示 機(jī)器碼)。三地址碼相比

13、之下,是低級(jí)的并且更類似于 匯編。不論高級(jí)或低級(jí)表示都有各自的優(yōu)點(diǎn)。例如,語法分析,比如可靠性分析,對(duì) 類似于 AST 的高級(jí)表示比類似于三地址碼的低級(jí)表示更容易實(shí)現(xiàn)。其它的優(yōu)化, 例如寄存器分配或指令調(diào)度,一般用低級(jí)表示,比如三地址碼來執(zhí)行。因?yàn)椴煌?IR 有不同的優(yōu)勢和劣勢,所以很多編譯器 ( 包括 LabVIEW會(huì)使用多 種 IR。在 LabVIEW中, DFIR作為高級(jí) IR 使用,而 LLVM IR作為低級(jí) IR 使用。/ 16DFIR在 LabVIEW中,作為高級(jí)表示的是 DFIR ,它是分等級(jí)且基于圖形的,其本身類 似于 G代碼。如同 G代碼, DFIR也是由很多包含接線端的節(jié)

14、點(diǎn)組成。每個(gè)接線 端可以連接到其它接線端。一些節(jié)點(diǎn),例如包含圖表的循環(huán),也可以相應(yīng)地包 含其它節(jié)點(diǎn)。2. LabVIEW G代碼與相應(yīng)的 DFIR圖表圖 2 顯示了一個(gè)簡單的 VI 以及它的初步 DFIR 表示。當(dāng)首次創(chuàng)建一個(gè) VI 的 DFIR圖表時(shí),它是 G代碼的直接翻譯, DFIR 圖表的節(jié)點(diǎn)一般與 G代碼中的其它 節(jié)點(diǎn)進(jìn)行一對(duì)一的通信。隨著編譯的進(jìn)行, DFIR節(jié)點(diǎn)有可能被移動(dòng)或者分開, 或者新的 DFIR 節(jié)點(diǎn)被加入。 DFIR一個(gè)最關(guān)鍵的優(yōu)勢是它保留了 G代碼的固有 特性,如并行機(jī)制等。用三地址碼表示的并行機(jī)制相比之下更難識(shí)別。DFIR為 LabVIEW編譯器提供了兩個(gè)顯著的優(yōu)勢。

15、首先, DFIR 從 VI 編譯器的表 示分離出編輯器。其次, DFIR能用作擁有多個(gè)前端和后端的編譯器的公共端。 以下是每一個(gè)優(yōu)勢的詳細(xì)解讀。DFIR 圖表從編譯器表示分離出編輯器在 DFIR 出現(xiàn)之前, LabVIEW有一個(gè)單獨(dú)的 VI 表示,由編輯器和編譯器共享 這樣阻止了編譯器在編譯過程中修改表示,這樣一來,進(jìn)行編譯器優(yōu)化就變得 困難了。/ 16圖 3. DFIR 提供一種構(gòu)架,允許編譯過程中優(yōu)化您的代碼圖 3 顯示了對(duì)應(yīng)于剛才提到的 VI 的 DFIR 圖表。此圖表描述了編譯器過程較靠 后的部分,此時(shí)它已被幾個(gè)變換分解并優(yōu)化過。您可以看到,這個(gè)圖表與之前 的圖表看起來有很大的不同。例

16、如:分解變換已經(jīng)移走了控制,指示,以及子VI 節(jié)點(diǎn),而用新的節(jié)點(diǎn)替代它們 UIAccessor, UIUpdater, FunctionResolver 和 FunctionCall 。 循環(huán)不變式代碼已從循環(huán)內(nèi)將增量和乘法節(jié)點(diǎn)移出。聚叢法在 For 循環(huán)內(nèi)部增加了 YieldIfNeeded 節(jié)點(diǎn),可以使執(zhí)行線程與其它競爭的工 作項(xiàng)目共享執(zhí)行。我們將會(huì)在后面的章節(jié)對(duì)變換進(jìn)行更深入探討。DFIR IR 可以作為多個(gè)編譯器前端與后端的公共端LabVIEW可以在數(shù)個(gè)不同的終端上工作,而其中一些終端與其它終端差別很大, 例如,一臺(tái) x86 臺(tái)式 PC 與一個(gè) Xilinx FPGA 。同樣地, La

17、bVIEW為用戶提供 了多種計(jì)算模型。除了使用 G語言的圖形化編程, LabVIEW也在提供了例如 MathScript 的基于文本的數(shù)學(xué)運(yùn)算。這就帶來了前端與后端的集中,它們都需 要在 LabVIEW編譯器下工作。使用 DFIR 作為公共 IR,前端進(jìn)行生產(chǎn)而后端進(jìn) 行消費(fèi),這樣便促進(jìn)了不同組合之間的重新使用。例如,運(yùn)行于 DFIR 圖表的常 數(shù)合并優(yōu)化執(zhí)行過程可以只需寫入一次而用于臺(tái)式,實(shí)時(shí), FPGA以及嵌入式對(duì) 象。DFIR 分解一旦進(jìn)入 DFIR, VI 首先運(yùn)行一系列的分解變換。分解變換的目標(biāo)是縮小或標(biāo)準(zhǔn) 化 DFIR 圖表。例如,未連線輸出通道分解會(huì)尋找在條件結(jié)構(gòu)和事件結(jié)構(gòu)中沒有

18、 被連線并被配置為“ Use Default If Unwired ”的輸出通道。對(duì)這些接線端來 說,變換賦給一個(gè)常量以默認(rèn)值,并將其連接到接線端,因而使DFIR 圖表的“Use Default If Unwired ”行為明確。隨后的編譯器掃描會(huì)完全相同地處理 這些接線端并假設(shè)它們都有連線的輸入。在這種情況下,語言的“Use DefaultIf Unwired ”特征在將表示縮小到更基本的形式后便被“編譯掉”了。這種做法也可以用于更為復(fù)雜的語言特性。例如,分解變換被用于將反饋節(jié)點(diǎn) 縮小到 While 循環(huán)上的移位寄存器中。另外一個(gè)分解將并行的 For 循環(huán)分解為/ 16幾個(gè)順序的具有額外邏輯

19、的 For 循環(huán),用以為順序循環(huán)將輸入分解為可平行化 的部分,隨后將所有的部分再次組合到一起。LabVIEW 2018的一個(gè)新特征,子 VI 直接插入,也是作為 DFIR分解來執(zhí)行。在 編譯的這個(gè)階段,被標(biāo)記為“直接插入”的子 VI 的 DFIR圖表直接加入調(diào)用程 序的 DFIR 圖表。除了避免子 VI 調(diào)用的架空,直接插入法通過將調(diào)用與被調(diào)程 序結(jié)合到一個(gè)單獨(dú)的 DFIR 圖表,為額外的優(yōu)化提供了可能性。例如,考慮一個(gè) 從 vi.lib. 調(diào)用 TrimWhitespace.vi 的簡單 VI 。圖 4. 用于演示 DFIR 優(yōu)化的簡單 VI 實(shí)例TrimWhitespace.vi 在 vi

20、.lib 中定義如下:圖5. TrimWhitespace.vi 結(jié)構(gòu)圖子 VI 直接插入調(diào)用程序中,得出等價(jià)于如下 G代碼的 DFIR 圖表。/ 166. 直接插入的 TrimWhitespace.vi DFIR 圖表的等價(jià) G 代碼既然子 VI 圖表直接插入調(diào)用程序的圖表,不可獲取代碼的刪除和死碼刪除能夠 簡化代碼。第一個(gè)條件結(jié)構(gòu)總是執(zhí)行,而第二個(gè)條件結(jié)構(gòu)從不執(zhí)行。7.因?yàn)檩斎脒壿嬍浅A浚瑮l件結(jié)構(gòu)可以刪除類似地,循環(huán)不變代碼將匹配類型的基元移出循環(huán)。最終的DFIR 圖表等價(jià)于如下的 G代碼。圖 8. 最終 DFIR 圖表的等價(jià) G 代碼因?yàn)?TrimWhitespace.vi 在LabVI

21、EW 2018 版本中默認(rèn)標(biāo)定為直接插入,所有 此 VI 的客戶端使用都能自動(dòng)享有這些益處。/ 16DFIR 優(yōu)化在 DFIR 圖表完全地分解后, DFIR優(yōu)化掃描開始。更多的優(yōu)化在隨后的 LLVM編 譯時(shí)被執(zhí)行。本章節(jié)僅講述了眾多優(yōu)化當(dāng)中的一部分。這些變換都是常用的編 譯器優(yōu)化,所以,想找到更多具體優(yōu)化的信息應(yīng)該較為容易。無法讀取代碼的刪除無法讀取代碼是永遠(yuǎn)無法執(zhí)行的代碼。刪除無法讀取代碼并不直接讓執(zhí)行變得 更快,但是它可以使您的代碼更精簡并且改善編譯時(shí)間,因?yàn)閯h除的代碼在隨 后的編譯掃描中將不再被訪問到。在無法讀取代碼刪除之前After Unreachable Code Eliminati

22、on圖 9. DFIR 無法讀取代碼刪除分解的等價(jià) G 代碼/ 16在這個(gè)例子中,條件結(jié)構(gòu)的“ Do not increment ”圖表從不執(zhí)行,所以變換刪 除了這個(gè)條件。因?yàn)闂l件結(jié)構(gòu)只剩下一個(gè)條件分支,因此它被順序結(jié)構(gòu)替換。 隨后的死碼刪除移除了邊框與枚舉常量。循環(huán)不變代碼移動(dòng)循環(huán)不變代碼移動(dòng)將識(shí)別循環(huán)內(nèi)部可以安全移至外部的代碼。因?yàn)橐瞥龃a的執(zhí)行次數(shù)更少,整體執(zhí)行速度將得到改善。循環(huán)不變代碼移動(dòng)變換之前循環(huán)不變代碼移動(dòng)變換之后圖 10. DFIR 循環(huán)不變代碼移出分解的等價(jià) G代碼在這個(gè)例子中,增量運(yùn)算被移到循環(huán)外面。循環(huán)本體不變,因此在創(chuàng)建數(shù)組的 同時(shí),不必在每個(gè)迭代重復(fù)進(jìn)行計(jì)算。公共子

23、表達(dá)式刪除公共子表達(dá)式刪除可識(shí)別重復(fù)計(jì)算,而將執(zhí)行一次計(jì)算,并重復(fù)使用計(jì)算結(jié)果/ 16BeforeAfter圖 11. DFIR 公共子表達(dá)式刪除分解的等價(jià) G 代碼常數(shù)合并常數(shù)合并支持那些在運(yùn)行時(shí)是常數(shù)的圖表部分,因而可以在初期就確定下來圖 12. 常數(shù)合并在 LabVIEW 結(jié)構(gòu)圖中非常直觀圖 12 中 VI 的哈希碼指出了常數(shù)合并的一部分。在這種情況下,“偏量”控制 不能夠常數(shù)合并,而加法基元的其它操作數(shù),包括 For 循環(huán),是恒定值。循環(huán)展開循環(huán)展開通過在合成碼部分多次重復(fù)一個(gè)循環(huán)的本體以及減少相同因子總的迭 代計(jì)數(shù),減少了循環(huán)架空。這樣減少了循環(huán)架空,并且在代碼尺寸增長損失的 情況下

24、,顯露了更多的優(yōu)化過程。死碼刪除死碼是多余的代碼。去除死碼加快了執(zhí)行時(shí)間,因?yàn)槿コ乃来a不再被執(zhí)行。 死碼并不是由您直接編寫的,它常常由 DFIR 圖表轉(zhuǎn)換操作產(chǎn)生。請(qǐng)考慮如下的例子。無法讀取代碼的刪除確定事件結(jié)構(gòu)可以被移除。這樣“創(chuàng)建”的死碼可 以被死碼刪除轉(zhuǎn)換移走。/ 16先前在無法讀取代碼刪除后在死碼刪除后圖 13. 死碼刪除能夠減少編譯器需要跨越的代碼數(shù)量此小節(jié)涉及的大部分轉(zhuǎn)換具有像這樣的相互關(guān)系;運(yùn)行一個(gè)轉(zhuǎn)換也許會(huì)引發(fā)其 它轉(zhuǎn)換運(yùn)行的機(jī)會(huì)/ 16DFIR后端轉(zhuǎn)換在 DFIR 圖表被分解并優(yōu)化后,很多后端轉(zhuǎn)換被執(zhí)行。這些轉(zhuǎn)換評(píng)估并注解DFIR,為最終將 DFIR圖表降低為 LLVM I

25、R做好準(zhǔn)備聚叢程序聚叢算法分析 DFIR 圖表的并行機(jī)制,并將節(jié)點(diǎn)歸類為您可以并行運(yùn)行的叢。這 種算法與 LabVIEW實(shí)時(shí)執(zhí)行系統(tǒng)緊密聯(lián)系,這些系統(tǒng)使用多線程協(xié)同多任務(wù)處 理。每個(gè)由聚叢程序產(chǎn)生的叢都作為執(zhí)行系統(tǒng)的單獨(dú)任務(wù)羅列出來。叢中的節(jié) 點(diǎn)以固定的,串行化的次序執(zhí)行。每個(gè)叢具有預(yù)訂的執(zhí)行次序允許替代程序共 享數(shù)據(jù)分配并顯著地提高了性能。聚叢程序也具有將結(jié)果插入長操作的職能。 例如循環(huán)或者 I/O ,因此這些聚叢程序與其它聚叢程序協(xié)同執(zhí)行多任務(wù)處理。內(nèi)嵌程序內(nèi)嵌程序分析 DFIR 圖并識(shí)別什么時(shí)候您可以重新使用數(shù)據(jù)分配以及什么時(shí)候您 必須進(jìn)行復(fù)制。 LabVIEW中的一個(gè)連接也許是一個(gè)簡單

26、的 32位標(biāo)量或 32 MB的 陣列。確保數(shù)據(jù)盡可能地重復(fù)使用對(duì) LabVIEW這樣的數(shù)據(jù)流語言來說是至關(guān)重 要的。請(qǐng)考慮如下的例子 請(qǐng)注意 VI 調(diào)試不能實(shí)現(xiàn)最好的性能和存儲(chǔ)器空間占用)圖 14. 簡單實(shí)例演示了內(nèi)嵌算法這個(gè) VI 初始化一個(gè)陣列,對(duì)每個(gè)要素增加了一些標(biāo)量值,并將其編寫為一個(gè)二 進(jìn)制文件。應(yīng)該有多少個(gè)陣列副本 ? LabVIEW最初不得不在本地創(chuàng)建陣列,而 加法運(yùn)算只能在那個(gè)陣列運(yùn)行。因此只需要一個(gè)陣列的副本而不是每個(gè)連接都 分配。這意味著一個(gè)顯著的不同無論是存儲(chǔ)器消耗還是執(zhí)行時(shí)間如果 陣列很大。在這個(gè) VI ,內(nèi)嵌程序意識(shí)到運(yùn)行“內(nèi)嵌”的時(shí)機(jī)并配置加法節(jié)點(diǎn)以 利用它。您可以

27、在 Tools?Profile 下使用“緩沖區(qū)分配”來檢驗(yàn)?zāi)帉懙?VIs 的這種行 為。工具不會(huì)顯示加法基元的分配,而顯示為沒有數(shù)據(jù)副本并且加法運(yùn)算內(nèi)嵌。/ 16這是可以接受的,因?yàn)闆]有其它節(jié)點(diǎn)需要原始陣列。如果您如圖 15 所示修改了 VI ,內(nèi)嵌程序會(huì)為加法基元制作一個(gè)副本。這是因?yàn)榈诙?寫為二進(jìn)制 Write to Binary File )需要原始的陣列并且必須在第一次 寫為二進(jìn)制基元 ,以描述節(jié)點(diǎn) 的功能性。 IL 提供了一個(gè)獨(dú)立平臺(tái)來描述節(jié)點(diǎn)的低級(jí)行為。 IL 的多種指令被用 來執(zhí)行運(yùn)算,讀寫存儲(chǔ)器,實(shí)現(xiàn)比較與條件跳轉(zhuǎn),等等。 IL 指令能夠?qū)Υ鎯?chǔ)器 或用來存儲(chǔ)中間值的虛擬寄存器中的值進(jìn)行操作。常用 IL 指令包括 GenAdd, GenMul, GenIf, GenLabel, 及 GenMove。在 LabVIEW 2009 及早期版本中, IL 結(jié)構(gòu)直接轉(zhuǎn)化為用于對(duì)象平臺(tái)的機(jī)器指令( 例如 80X86 與 PowerPC。 LabVIEW使用一個(gè)簡單的一次掃描寄存器分配程序 將虛擬寄存器映射到物理機(jī)器寄存器。每個(gè) IL 指令發(fā)出一組用于特定機(jī)器指令 的硬件編碼,從而在每個(gè)支持對(duì)象的平臺(tái)執(zhí)行它。它盲目地追求速度,是一種 即席是一種多用途,高性能,開放源代碼的編譯器構(gòu)架,起初作 為伊利諾斯州立大學(xué)的一個(gè)研究項(xiàng)目被發(fā)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論