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