2016-08-02 27 views
1

我聽到有關Octave的實驗性JIT編譯器功能的非常矛盾的信息,從「它是一個玩具項目,但它基本上不起作用」到「我已經使用它並獲得了重要加速」。Octave JIT編譯器。當前狀態和最小示例演示效果

我知道,爲了使用它成功的一個在配置時需要

  • 編譯倍頻與--enable-jit
  • 啓動倍頻與--jit-compiler選項
  • 指定在運行時JIT編譯偏好使用jit_enablejit_startcnt命令

但我一直無法令人信服地重現效果;不知道這是因爲我錯過了其他我沒有意識到的步驟,或者它對我的機器沒有太大影響。

問:能否成功使用該功能的人可以提供一個最小的工作示例,以證明其正確使用及其對機器的影響(如果有)?

回答

7

簡而言之:

  • 你不需要做任何事情來使用JIT,它應該只是工作,如果它可以加快你的代碼;
  • 它幾乎沒用,因爲它只適用於簡單的循環;
  • 它僅僅是一個概念的證明;
  • 目前還沒有人在改進它,因爲:
    • 這是一個複雜的問題;
    • 它主要是修復馬蹄形八度碼;
    • 使用LLVM太不穩定。

問:有人誰使用成功的特性可以提供一個最小的工作示例演示的正確使用方法,並在其計算機上造成了哪些影響(如果有的話)?

沒有什麼可顯示的。如果您使用JIT支持構建Octave,則Octave將自動爲某些循環使用更快的代碼。唯一的區別是速度,而不必更改代碼(儘管你可以在運行時禁用JIT):

octave> jit_enable (1) # confirm JIT is enabled 
octave> tic; x = 0; for i=1:100000, x += i; endfor, toc 
Elapsed time is 0.00490594 seconds. 
octave> jit_enable (0) # disable JIT 
octave> tic; x = 0; for i=1:100000, x += i; endfor, toc 
Elapsed time is 0.747599 seconds. 

## but you should probably write it like this 
octave> tic; x = sum (1:100000); toc 
Elapsed time is 0.00327611 seconds. 

## If Octave was built without JIT support, you will get the following 
octave> jit_enable (1) 
warning: jit_enable: support for JIT was unavailable or disabled when Octave was built 

這是一個簡單的例子,但你可以看到更好的例子和更多細節唯一一個工作的人,以及his presentation at OctConf 2012。更多細節(過時),Octave's JIT wiki page

請注意,Octave的JIT僅適用於非常簡單的循環。如此簡單的循環,沒有人熟悉該語言會首先寫出它們。這個特性是作爲概念證明的,也是任何想要擴展它的人的起點(我個人更喜歡編寫向量化代碼,這就是語言的設計目的)。

Octave的JIT還有一個問題,那就是它使用LLVM。 Octave開發人員發現它對於這個目的來說太不可靠了,因爲它不斷向後兼容。 LLVM的每個次要版本都打破了Octave版本,所以Octave開發人員在LLVM 3.5發佈時停止修復,並在默認情況下將其禁用。

+2

也許我們應該更新http://wiki.octave.org/FAQ#Just-In-Time_compiler和/或鏈接到這個答案 – Andy