導航:首頁 > 源碼編譯 > 高級jit編譯

高級jit編譯

發布時間:2023-04-27 21:02:47

Ⅰ JIT(上):Tensorflow如何實現即時編譯

Tensorflow的JIT(just-in-time)是指在運行 @tf.function 修飾的python函數時,由 jit 、 tf2xla 和 XLA 一起完成一系列如子圖構造、子圖優化、圖編譯和圖執行等操作。編譯後的可執行程序-- executable 會存放到cache中,供再次調用時直接獲取執行。JIT的好處在 開篇 已經講過了,這里不再贅述。

JIT的流程可以概括為:Tensorflow子圖構造/優化,graph -> HLO,編譯/執行,合並計算結果到Tensorflow圖這四部分。本文只涉及圖編譯和圖執行。

函數中ops在子圖構造階段被包裹進一個cluster node,並替換成 xla_compile 和 xla_run 這兩op,而 XlaCompileOp 和 XlaRunOp 就是它們的 OpKernel ,分別用於圖編譯和執行。

XlaCompileOp通過 XlaCompilationCache 獲取或編譯executable,並將其封裝成 XlaExecutableClosure ,並緩存在 XlaExecutableClosureStore 。 XlaRunOp 用從XlaCompileOp傳遞來的key在cache中查找並執行executable。

從編譯流程圖可以看到,XLA的編譯結果會緩存到XlaCompilationCache,後續調用可以根據 signature 在cache中查找executable。

函數的 signature 是由 BuildSignature(function, args) 根據函數和arguments生成的。即使是同一個函數,只要input tensors不同,signature也會不一樣,這就是 power() 被編譯兩次的原因:第三次函數調用時,由於無法通過signature在cache中找到executable而觸發編譯。

signature表示唯一的計算圖:只要函數中的ops序列和arguments(type/shape)是確定的,那麼計算圖也是確定的。

編譯之前需要通過 tf2xla 將圖轉換成XLA支持的語言 HLO 。tf2xla為每個Tensorflow op創建了生成HLO的 XlaOp ,因此,只要執行該Tensorflow子圖,就可以生成具有相同的拓撲排序的HLO -- XlaComputation 。

XlaComputation (HLO)可以認為是一個運行在device上的純函數,它的input/output會伴隨著host-to-device(H2D)和device-to-host(D2H)的數據傳輸。

我們知道,Tensorflow圖中的input tensor有兩種: tf.Placeholder 和 tf.Variable ,前者每個step都會將新data發送到device,而後者是模型參數,它們會常駐內存,只在store/load checkpoint才會有H2D/D2H。

而純函數的定義是:

不管是input還是output,雖然variable和其他argument一樣存在於HLO的參數列表和返回值列表中,但它們實際上是常駐於device的,不需要也不應該H2D/D2H。

因此,HLO在編譯時還需要通過 argument_input_indices 、 resource_input_indices 和 resource_update_to_input_index 等options來區分arguments和variables。

此外,如果有input是常數,為了避免無謂的H2D開銷,可以把它固化到函數內部。同理,對於常數output,它沒必要出現在函數中,可以直接定義在 XlaCompilationResult 的output buffer。

XlaCompilationResult是 Graph -> HLO 的output,它封裝了HLO以及上述部分metadata、buffers。

XlaCompileOp會把編譯好的executable、metadata、input/output buffers、options等統統封裝進一個closure -- XlaExecutableClosure ,並將其緩存在 XlaExecutableClosureStore 供 XlaRunOp 獲取。

XlaRunOp 可以通過一個數字字元串key(從0開始累加)從cache中查找並執行XlaExecutableClosure,這個key由XlaCompileOp提供。

java中的JIT編譯到底是什麼意思

在JIT編譯器生成本機代碼後,它會重寫存根常式,插入一個jmp指令跳轉到剛才JIT編譯器的代碼。只有當要調用某個方法時,JIT編譯器才會將CIL的方法體編譯為相應的本機機器碼版本。這樣可以優化程序的工作集。

Ⅲ JIT編譯器的分類

事實上,JIT編譯器分成兩種:經濟編譯器和普通編譯器。 普通JIT編譯器則是預設的運行時配置,它會對其產生的代碼進行即時優化。這樣做無形中給予了.NET超出傳統預編譯語言的一個優點:預編譯語言只能對其處理的代碼將要運行於其上的平台做一番大致的事前估計。
JIT編譯器可以經過准確調節達到當前運行時狀態,結果可以完成一些預編譯語言無法完成的工作:更高效地利用和分配CPU寄存器。在適當的情況下實施低級代碼優化,比如常量重疊、拷貝復制、取消范圍檢查、取消常規副表達式以及方法內聯等
在代碼執行期間監控當前的物理和虛擬內存需求從而更高效地利用內存
產生特定的平台指令以准確、充分地利用實際的處理器模式
NET編譯的結果就是JIT所帶來的額外負載要求並沒有產生顯著的性能損失。 JIT Compiler(Just-in-time Compiler) 即時編譯
最早的Java建置方案是由一套轉譯程式(interpreter),將每個Java指令都轉譯成對等的微處理器指令,並根據轉譯後的指令先後次序依序執行,由於一個Java指令可能被轉譯成十幾或數十幾個對等的微處理器指令,這種模式執行的速度相當緩慢。針對這個問題,業界首先開發出JIT(just in time)編譯器。當Java執行runtime環境時,每遇到一個新的類別(class:類別是Java程式中的功能群組),類別是Java程式中的功能群組-JIT編譯器在此時就會針對這個類別進行編譯(compile)作業。經過編譯後的程式,被優化成相當精簡的原生型指令碼(native code),這種程式的執行速度相當快。花費少許的編譯時間來節省稍後相當長的執行時間,JIT這種設計的確增加不少效率,但是它並未達到最頂尖的效能,因為某些極少執行到的Java指令在編譯時所額外花費的時間可能比轉譯器在執行時的時間還長,針對這些指令而言,整體花費的時間並沒有減少。基於對JIT的經驗,業界發展出動態編譯器(dynamic compiler),動態編譯器僅針對較常被執行的程式碼進行編譯,其餘部分仍使用轉譯程式來執行。也就是說,動態編譯器會研判是否要編譯每個類別。動態編譯器擁有兩項利器:一是轉譯器,另一則是JIT,它透過智慧機制針對每個類別進行分析,然後決定使用這兩種利器的哪一種來達到最佳化的效果。動態編譯器針對程式的特性或者是讓程式執行幾個循環,再根據結果決定是否編譯這段程式碼。這個決定不見得絕對正確,但從統計數字來看,這個判斷的機制正確的機會相當高。事實上,動態編譯器會根據「歷史資料」做決策,所以程式執行的時間愈長,判斷正確的機率就愈高。以整個結果來看,動態編譯器產生的程式碼執行的速度超越以前的JIT技術,平均速度可提高至50%。
JIT 頁面渲染引擎
JIT 頁面渲染是 COMSHARP CMS 為了實現網站內容即時更新而開發的頁面生成技術,JIT頁面渲染引擎直接從資料庫獲取網站最新內容,瞬間生成頁面輸出給訪問者,並通過 URL 轉寫技術實現純靜態地址。JIT 頁面渲染技術是針對傳統 CMS 生成靜態 HTML 文件而言。傳統 CMS 由於使用腳本代碼模板技術,頁面生成前,需要將資料庫中的頁面內容用外部模板進行解析與渲染,導致嚴重的性能問題,為了解決這個問題,傳統 CMS 一般採用生成 HTML 靜態文件技術,即,在內容創作完成後,對全站的內容執行一個靜態 HTML 文件生成過程,最終,全站內容以靜態 HTML 文件的形式存在。靜態 HTML 文件技術最顯著的優勢是性能出眾,然而這種技術最嚴重的問題在於,用戶對站點任何修改與更新,必須首先經過一次全站 HTML 文件重新生成過程,然後才能被訪問者看到。根據不同 CMS 產品的性能和站點規模,這個 HTML 生成過程可能長到十幾分鍾到幾十分鍾或更長。也有個別 CMS 產品使用觸發式頁面渲染模式,即內容更新後,並不立即生成 HTML 文件,而是在用戶第一次訪問該頁面時,觸發生成該頁面的 HTML 文件,這種技術的問題在於,用戶第一次訪問被更新頁面的時候,可能經歷非常漫長的等待,因為站點內各個頁面之間並非孤立的,他們可能相互引用,雖然訪問的只是一個頁面,為了對引用頁面同步更新,需要重新生成 HTML 文件的頁面可能有多個。JIT 頁面渲染如何工作?下圖,是 COMSHARP CMS JIT 渲染引擎與傳統 CMS 生成 HTML 靜態頁面模式對比。可以看出,JIT 渲染引擎直接將網站最新內容從資料庫渲染給訪問用戶,而傳統 CMS 的站點內容在到達訪問用戶之前,首先要經歷一個 HTML 的轉換過程。COMSHARP CMS JIT 頁面渲染如何實現毫秒級的渲染速度?COMSHARP CMS 在頁面渲染的時候,JIT 引擎可以在數十毫秒的時間內容完整整個頁面的生成,這樣就保證用戶訪問的時候,不會因 JIT 渲染造成延遲。事實上,COMSHARP CMS 網站訪問速度只取決於伺服器帶寬,頁面生成過程帶來的延遲可以忽略不計。我們有兩項技術保證這樣的性能:編譯級主題模板COMSHARP CMS 的編譯級主題模板直接內嵌在系統的 DLL 中,主題模板的套用是在運行時(Run Time)完成,這和傳統 CMS 的調用腳本代碼模板解釋運行是截然不同。

Ⅳ JIT編譯器的簡介

在Java編程語言和環境中,即時編譯器(JIT compiler,just-in-time compiler)是一個把Java的位元組碼(包括需要被解釋的指令的程序)轉換成可以直接發送給處理器的指令的程序。當你寫好一個Java程序後,源語言的語句將由Java編譯器編譯成位元組碼,而不是編譯成與某個特定的處理器硬體平台對應的指令代碼(比如,Intel的Pentium微處理器或IBM的System/390處理器)。位元組碼是可以發送給任何平台並且能在那個平台上運行的獨立於平台的代碼。

Ⅳ Java使用JIT編譯器,執行效率與C++相比哪個

我猜測:JAVA即使編譯成機器碼,其執行效率也不如C++的。
從整體來看,JAVA有一些需要額外的消耗是C++沒有的,比如:內存回收、反射、數組越界判斷等。
內存回收這一機制要求編譯後的執行文件除了我們自己寫的邏輯之外,還要有一個線程來管理內存。
反射一方面要有一塊內存用來做類型字典,另一方面又要對反射調用做安全檢查。
……
另外,如果JIT編譯之後仍然有類載入器這類的東西,那麼這個程序就還要內部集成一個.class文件到機器指令的解釋器或編譯器。
……
總之,JIT編譯後的文件不得不為JAVA自身的復雜性增加一系列機制在裡面,但C++的文件除了我們自己寫的邏輯和本地可執行文件頭之外就什麼都沒有了。

Ⅵ JIT編譯的介紹

JIT 編譯 (JIT compilation),運行時需要代碼時,將 Microsoft 中間語言 (MSIL) 轉換為機器碼的編譯。

Ⅶ JIT編譯器的介紹

JIT編譯器,英文寫作Just-In-Time Compiler,中文意思是即時編譯器。JIT編譯器能夠將MSIL編譯成為各種不同的機器代碼,以適應對應的系統平台,最終使得程序在目標系統中得到順利地運行。

閱讀全文

與高級jit編譯相關的資料

熱點內容
華為筆記本電腦怎麼安裝抖音app 瀏覽:408
阿里雲國際版試用的伺服器怎麼搞 瀏覽:893
java正則表達式工具 瀏覽:158
oa伺服器怎麼設置ftp 瀏覽:8
安卓如何安裝obb 瀏覽:440
QQ聊天記錄journal文件夾 瀏覽:118
蘋果公司雲伺服器地址 瀏覽:85
加密記事本手機 瀏覽:437
汽車壓縮機變頻閥 瀏覽:95
域外伺服器是什麼意思 瀏覽:639
大眾點評伺服器怎麼老卡頓 瀏覽:556
javavector與list的區別 瀏覽:316
java初始化類數組 瀏覽:303
java字元串轉換成json對象 瀏覽:647
android非阻塞socket 瀏覽:358
編譯系統概念 瀏覽:452
天眼通app能做什麼 瀏覽:557
魅族手機怎麼加密圖庫 瀏覽:8
rpa編譯器 瀏覽:572
車載雲伺服器記錄 瀏覽:740