龐雙玉 蘇翔宇
摘要:Julia編程語言是美國麻省理工學(xué)院MIT正式發(fā)布的面向科學(xué)計算的高性能編程語言。Julia集合c的速度,Matlab數(shù)學(xué)處理特征,Python的通用編程特性與Shen的命令行處理。Julia通過協(xié)程和遠(yuǎn)程宏調(diào)用機(jī)制實現(xiàn)了并行計算,是第一個編程語言級別上實現(xiàn)并行處理的模式的語言。本文探討Julia并行計算實現(xiàn)模式并與hadoop集群分布式系統(tǒng)進(jìn)行對比,討論其各自的優(yōu)劣。
關(guān)鍵詞:Julia;協(xié)程;任務(wù);并行處理;hadoop集群
中圖分類號:G424 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)14-0242-02
1引言
JuliaJulia是一個面向科學(xué)計算的高性能動態(tài)高級程序設(shè)計語言.Julia是一種高級通用動態(tài)編程語言,它最初是為了滿足高性能數(shù)值分析和計算科學(xué)的需要而設(shè)計的,不需要編譯器,速度快,也可用于客戶端和服務(wù)器的Web用途.Julia從一開始就為高性能而設(shè)計。Julia程序可通過LLVM編譯為多個平臺的高效本機(jī)代碼。它具有如下特性。
(1)動態(tài)
Julia是動態(tài)類型的,感覺就像是一種腳本語言,并且對交互使用具有良好的支持。
(2)可選輸入
Julia具有豐富的描述性數(shù)據(jù)類型語言,并且類型聲明可用于闡明和鞏固程序。
一般Julia使用多重調(diào)度作為范例,使表達(dá)許多面向?qū)ο蠛凸δ苄跃幊棠J阶兊萌菀?。它提供異步I/O,調(diào)試,日志記錄,性能分析,程序包管理器等。
(3)易于使用
Julia具有高級語法,因此對于任何背景或經(jīng)驗水平的程序員來說,它都是一種可訪問的語言。瀏覽Julia的微基準(zhǔn)測試,以了解該語言。
(4)開源的
Julia是根據(jù)MIT許可提供的,所有人免費使用。所有源代碼都可以在GitHub上公開查看。
2Julia并行處理模式
并行和并發(fā)是討論編程語言多任務(wù)處理時,經(jīng)常提及的。并行和并發(fā)是兩個不同的概念。
并發(fā)指的是計算處理單元同時對多個進(jìn)程或者線程進(jìn)行響應(yīng)。并發(fā)處理時,多個進(jìn)程或者線程共享計算單元。多個進(jìn)程或者線程之間,依靠同步機(jī)制來協(xié)調(diào)。其中一個進(jìn)程或者線程占用計算單元時,另一個必須等待。類似于信道復(fù)用,對用戶來說,是同時執(zhí)行的。
并行指的是多個任務(wù)同時運行,是多個任務(wù)同時運行在多個計算單元上,是真正的多任務(wù)同時執(zhí)行。兩者之間的區(qū)別,如下圖所示。并發(fā)處理,多個任務(wù)共占計算單元。
并行處理多個任務(wù)同時在多個計算單元上運行。
Julia提供了一個基于消息傳遞的多重處理環(huán)境,允許程序在獨立的內(nèi)存域內(nèi)同時控制并發(fā)多任務(wù)執(zhí)行。這個內(nèi)存空間由每個CPU單獨控制,他們之間通過內(nèi)部消息機(jī)制來通信。Julia的消息機(jī)制不同于MPI,并不是收發(fā),而是類似于函數(shù)調(diào)用的機(jī)制。
并行程序的兩個基礎(chǔ)是遠(yuǎn)程引用(Remote Reference)和遠(yuǎn)程調(diào)用(Remote Call)遠(yuǎn)程引用是引用其他特定處理器的對象,這個引用可被其他任何處理器訪問。遠(yuǎn)程調(diào)用是指的是一個處理進(jìn)程,發(fā)起請求,用于以一定參數(shù)調(diào)用其他處理進(jìn)程(或許是自身)中某個許可的函數(shù)。
Julia將進(jìn)程稱為worker,遠(yuǎn)程調(diào)用通過本地進(jìn)程在遠(yuǎn)程worker中啟動某一處理過程。比如啟動一個函數(shù)。遠(yuǎn)程調(diào)用在啟動以后,并不阻塞等待,而是執(zhí)行遠(yuǎn)程調(diào)用后面的代碼,遠(yuǎn)程調(diào)用啟動以后返回一個Remote Reference r對象,遠(yuǎn)程調(diào)用結(jié)果,還需要用fetch0語句來獲取。
Julia也提供了宏@spawnat,該宏實現(xiàn)了remotecall遠(yuǎn)程調(diào)用的功能,@spawnat有兩個參數(shù),@spawnat pid表達(dá)式,其中pid指明運行處理任務(wù)的worker id,表達(dá)式指明對遠(yuǎn)端worker運行處理任務(wù)后返回的結(jié)果要進(jìn)行的計算。
3Julia并行計算實例
以一個在遠(yuǎn)端處理器創(chuàng)建并返回矩陣的實例,演示Julia遠(yuǎn)程調(diào)用過程。
julia>using Distributed//使用分布式系統(tǒng)
iulia>addprocs(4)//添加4個worker
Julia>r=remotecau(2,rand,2,2)//發(fā)起遠(yuǎn)程調(diào)用,調(diào)用遠(yuǎn)程worker創(chuàng)建一個隨機(jī)矩陣
其中第一個參數(shù)2是遠(yuǎn)端worker id第二個參數(shù)rand是在遠(yuǎn)程work上啟動的函數(shù)。
第三和第四個參數(shù)都是2,是傳遞給rand函數(shù)的參數(shù),指明創(chuàng)建一個2x2的隨機(jī)矩陣。
RemoteRef(2,1,5)//生成RenoteRef對象
其中第一個參數(shù)2是遠(yuǎn)端worker id第二個參數(shù)1發(fā)起遠(yuǎn)程調(diào)用的worker id第三個參數(shù)是為當(dāng)前RemoteRef分配的id.
Julia>fetch(r)//捕獲RemoteRef對象
生成的2x2隨機(jī)矩陣
2x2Float64Array:
4julia與分布式大數(shù)據(jù)hadoop平臺的比較
Julia從編程語言級別實現(xiàn)了并行計算,而分布式大數(shù)據(jù)平臺也實現(xiàn)了并行計算,現(xiàn)在從性能和響應(yīng)時間等以下幾個方面把二者進(jìn)行比較。
(1)二者實現(xiàn)基礎(chǔ)是不一樣的,hadoop構(gòu)建了一個獨立的分布式系統(tǒng),julia是通過SSH方式無密碼登陸遠(yuǎn)程特定的機(jī)器,并啟動機(jī)器上的Julia工作進(jìn)程。
(2)Hadoop有自己的文件系統(tǒng)HDFS,并行處理過程同時依賴于HDFS,從結(jié)構(gòu)上分為Namenode和DateNode節(jié)點,iulia并行計算中,每個機(jī)器的地位是平等的,進(jìn)程級別之間的消息通信,不涉及文件系統(tǒng)。
(3)Hadoop善于數(shù)據(jù)分分析任務(wù),Julia善于數(shù)據(jù)處理和計算任務(wù)。
5結(jié)論
Julia在編程級別上實現(xiàn)了多核并行計算處理,從而能夠進(jìn)行大規(guī)模數(shù)據(jù)集上的科學(xué)計算,這是fortran語言所無法實現(xiàn)的,Julia這種并行模式也為構(gòu)建基于Julia的并行分布式環(huán)境打下了基礎(chǔ)。在軟件級別上實現(xiàn)并行分布式環(huán)境會成為一種趨勢。
[通聯(lián)編輯:聞翔軍]