Julia是一個剛剛走入大眾視野的科學計算利器!
你可能會說了,科學計算?不是有matlab了嗎?而且如果做統計,還有R、Python、Stata之類的可以使用,為什么要用Julia呢?
很簡單,方便+快!
首先,Julia的語法基本上就是Matlab+Python+R的混合,像Matlab一樣簡單,像Python一樣嚴謹,像R...算了,還是不要像R了。
此外,作為「腳本語言」以及「科學計算語言」,Julia有個變態的特征:不怕循環!熟悉Matlab、R的人都知道,寫這些程序的時候,通常會被建議「少寫循環」。而實際上,如果你沒有遵從這些規則,你會發現寫出來的程序奇慢無比!當然,Matlab中也有一些設計企圖規避循環,比如bsxfun等函數,但是很多情況下,循環在所難免。
那么Julia如何做到「不怕循環」這一點呢?Julia做了這么一些工作。首先,在Julia里面,是有「類型」的,比如學過C的都知道計算機中數字分為整型(int)、浮點型(float)、雙精度(double)等類型,而Julia也對類型做了嚴格區分。不過不要怕,其實沒什么大不了的,不會比Matlab復雜多少。而有了類型的區分,Julia使用LLVM這個工具引入了JIT,也就是在程序(比如循環體、函數)第一遍被執行的時候,這個循環體、函數就已經被編譯好了。當這個循環體、函數再次被執行的時候,就不需要重新解釋代碼,只需要執行編譯好的程序就好了。
有了這個黑科技,Julia的執行速度理論上是可以接近C的(理論上能達到的最快速度)。實際上我的工作過程中就有大量的程序因為嫌慢使用C寫,速度的確比Matlab不知道要快到哪里去(這里提一下,根據我的經驗,不可盲目崇拜C,沒有經驗的人寫出的程序,或者沒有復雜到一定程度的程序,速度可能比Matlab還慢)。
關于Julia的速度與其他語言的比較,可以參考Julia的網站:TheJuliaLanguage,其中有各編程語言的對比。不過這里要提一下,里面的參數不能完全相信,比如Matlab等語言的寫法不是最有效的寫法,所以在里面Matlab可能比Julia慢很多。而實際上,對于最簡單的程序,Julia的速度比不過Matlab的。至于原因嗎,我想有這么兩點:首先Matlab不用編譯;其次,Matlab使用了Intel的MKL庫,而MKL庫是經過匯編級別的優化的。當然,Julia也可以使用MKL,下面我會介紹。
所以總體說來,當涉及到大量的循環的時候,C(Fortran)和Julia是非常不錯的選擇,而出于寫程序的方便程度和學習曲線的考慮,Julia顯然優于C(Fortran)。
奧,Julia還有個優點沒有說,這個可以秒殺Matlab,那就是:開源,免費!
此外,Julia還有一個更大的優點:非常方便的調用C、Python等寫成的程序。Python本來就被成為「膠水語言」,可以調用幾乎所有其他語言,而Julia可以調用Python,這就變相給了Julia這個能力。此外,Julia還可以直接調用C寫成的程序。所以平時工作的時候,非常常用的一些模塊我都已經寫成C放在一個庫里面,這樣就可以用Python調用C,Julia調用C,R調用C,Matlab調用C...順便提一下,Matlab也可以調用C,但是調用方式別提多蛋疼。
好,下面回到我們學校的問題上來。之前的一個項目我使用Julia+C一起寫的,但是前段時間我們學校的超算中心非得給我們換個賬號,這下好了,之前已經有的Julia突然沒了。前面也說了,我是沒有管理員權限的,所以使用yum的方式安裝就走不通了。還好Julia是開源的,意味著我可以拿到Julia的源碼,自己編譯一個。
可是,真的問題出來了!Redhat出于對「穩定」的變態追求,里面的程序不會用最新的版本。比如,最坑爹的,gcc(一個c的編譯器)的版本停留在『RedHat4.4.7-3』這個版本上。而開源社區日新月異,這個版本太老了,以至于不能編譯Julia了!從此,我開始了漫漫的安裝之旅。
在介紹我在沒有管理員權限+沒有新版本gcc的情況下如何安裝Julia之前,可以先介紹一下普通青年安裝Julia的正確姿勢。
windows用戶,去JuliaDownloads上直接下載安裝。建議安裝Julia+Juno的套裝,后者是一個Julia的IDE,如果不裝Juno,Julia的界面會非常不友好!
Mac用戶,同樣去JuliaDownloads上直接下載安裝,安裝方法與Mac軟件的一般安裝方法一樣,安裝好之后在Applications里。或者可以參考下面Linux用戶使用源碼安裝,但其實沒這個必要。
Linux用戶,就有多種選擇了。或者選擇源碼安裝,我下面會詳細介紹。或者可以安裝已經編譯好的版本。不過更建議使用apt-get(Debian/Ubuntu)、yum(Fedora/Redhat/Cent)安裝。
安裝好之后,在命令行輸入julia,應該能看到如下界面(win用戶可能需要設置環境變量):
嗯,下面我就要開始介紹作死的源碼安裝方式了!
上面提到了,之所以選擇源碼安裝,最大的原因是我沒有管理員權限。其次,源碼安裝還有個好處就是,可以將Intel的MKL和Julia結合起來,強上加強,至強!
總的來說,我手動安裝Julia的過程是:
gmp/mpc/mpfr=>gcc
Git
cmake
Python2=>LLVM
Julia
是的,你沒看錯,為了安裝Julia,我安裝了這么多東西!!!截圖給你們看:
安裝gcc的原因不用說了,因為編譯Julia需要高版本的gcc,所以必須自己裝一個gcc。為了安裝gcc。在安裝的過程中,提示我缺少gmp/mpc/mpfr這三個包,這個問題不大,按照提示,去相應的網站,找到這幾個包的最新版本,wget一下,安裝就好了。至于怎么安裝,一般來說安裝的順序是:
./configure--prefix=/home/aragorn/softs/其中--prefix可以理解為安裝路徑
make
makeinstall
經過這三個命令,一般就可以安裝好。gmp/mpc/mpfr這三個包都是按照這個順序,wget下載,tar-xvf***.xz解壓縮,進去,然后按照上面三個步驟安裝。
至于gcc,可以去InstallingGCC-GNUProject上看看,上面有安裝gcc的詳細步驟。注意如果需要安裝gmp/mpc/mpfr這三個包,在configure的時候,后面需要加『--with-gmp=/home/aragorn/softs』,也就是制定者三個包的安裝位置。
經過大概幾個小時的等待,gcc裝好了。總以為可以編譯Julia了,可是又出錯了!仔細一看,居然是gitcheckout出錯了!查了一下,臥槽,git命令也是老掉牙啊!沒辦法,去git官網,找git的源碼下載,gitclonegit/git·GitHub下載下來,安裝!安裝過程可以參考文件夾下面的INSTALL文件,有詳細描述。
后來又提示我cmake沒有。同樣,按照上述過程,安裝cmake。
中間我也不記得是哪一步了,提示LLVM必須安裝。裝!可是安裝LLVM的時候,又提示我Python的版本太低!Redhat的Python版本居然是2.6的!!!怎么能忍,裝!去Python官網,干脆把Python2and3的源碼都下載了下來,裝裝裝!!!
這里需要注意的是,由于安裝的這些程序都是安裝在自己的目錄下面的,所以需要修改環境變量。修改方法如下:
cd~
vim.bashrc
找到exportPATH=(如果沒有則新建),把安裝的程序的bin目錄添加上去,比如我安裝的gcc的目錄是/home/aragorn/bin/gcc/,那么就要寫成『exportPATH="/home/aragorn/bin/gcc/bin:$PATH"』,建議每裝一個程序,都把bin目錄添加進來
同樣,找到exportLD_LIBRARY_PATH=(如果沒有則新建),把安裝的程序的lib/lib64目錄添加上去,比如我的寫成『exportPATH="/home/aragorn/bin/gcc/lib64:$LD_LIBRARY_PATH"』,建議每裝一個程序,都把lib目錄添加進來
:wq
如此設置,系統找程序或者庫就按照上面的順序開始找。比如雖然系統自帶的gcc版本比較老,但是由于我設置了PATH,所以會先從/home/aragorn/bin/gcc/bin這個目錄找gcc這個命令。修改結束之后,使用source.bashrc使得以上更改生效。
此外,我在瀏覽系統目錄的時候,驚喜的發現原來這臺電腦里自帶了MKL庫。開心死了。要知道這個庫是付費的,當然對科研工作者是免費的。既然有了,就避免麻煩了,用!怎么用呢?在編譯Julia之前,要做這么幾個工作:
source/opt/intel/bin/compilervars.shintel64
source/opt/intel/mkl/bin/mklvars.shintel64ilp64
exportMKL_INTERFACE_LAYER=ILP64
至于這幾步究竟在干什么,我也不知道,也懶得去搞清楚,大體是在設置MKL庫的環境變量。
好了,萬事具備,終于可以編譯julia了!分這么幾步:
gitclonegit://http://github.com/JuliaLang/julia.git復制源碼到本地
cdjulia
gitcheckoutrelease-0.4這一步請參考Julia的github主頁,0.4為目前最新的版本號。這一步一定要做,否則自動編譯的是正在開發的版本。
vimMake.inc這一步要做很多修改。首先,在開始加入一樣『prefix=/home/aragorn/bin/julia』后面是你要安裝julia的路徑。其次,由于上面已經安裝了最新的LLVM,可以使用最新的LLVM,設置『USE_SYSTEM_LLVM=1』。最后,由于要使用MKL,將『USE_INTEL_MKL?=0』『USE_INTEL_MKL_FFT?=0』『USE_INTEL_LIBM?=0』都改為1。github的網頁上同時建議將『USEICC?=0』『USEIFC?=0』也設為1,但是根據我的經驗,intel的icc編譯器并沒有gcc好用,所以建議仍然保留為0,使用gcc。
make等待一大段時間
makeinstall
好啦,現在設置好環境變量,就可以優雅的開始使用帶MKL的Julia啦!
最后,我只想吐槽一句,如果搞科學計算,普通青年用Ubuntu/Debian,文藝青年用Gentoo,二逼青年才他媽的用Redhat!!!