秒導(dǎo)讀:本文將淺談多線程程序開發(fā),如何使用線程提高程序效率,如何避免死鎖,以及確保程序邏輯正確
古時候人們用牛來拉重物,當(dāng)牛拉不動圓木,人們不曾想過培育更大的牛,同樣的,在摩爾定律被打破的今天,我們需要集群來完
集群與并行計算一個巨大的話題,今天我先從最基本的多線程說起,線程,人們總在用,盡管并不總是那么好用。
首先需要明白的是cpu的一個核心在同一時間只能執(zhí)行一個線程。雖然你在windows打開任務(wù)管理器,或是在Linux下輸入ps -ef看到的進程(一個進程可能包括數(shù)個線程,事實上linux并不嚴格區(qū)分線程與進程,linux線程與進程共享了邏輯內(nèi)存空間)數(shù)肯定遠遠大于cpu核心數(shù)。之所以計算機能同時運行如此之多的程序,是因為操作系統(tǒng)kernel的調(diào)度機制。kernel以線程為基本單位進行調(diào)度,kernel為每個分配時間片,在時間片內(nèi)線程在cpu上運行,當(dāng)時間片耗盡,kernel將保存線程的上下文信息,將其掛起并從新計算時間片,當(dāng)再次輪到該線程運行時,kernel將恢復(fù)線程的上下文,線程將再次在cpu上運行,并且對其本身就像什么也沒發(fā)生過一樣
正因為線程不知道自己被暫停又恢復(fù)過,所以稍不注意就可能出現(xiàn)邏輯錯誤,關(guān)于線程,有些教材用過買票的例子:初始化票數(shù)count=100,然后用很多線程執(zhí)行如下的代碼:
if(count>0)
count--;
這時候十有八九會出現(xiàn)票數(shù)為負的情況,當(dāng)線程判斷完count>0被掛起,當(dāng)線程再被喚醒,count已被其他線程修改,已經(jīng)小于等于0,只是線程并不知情,依舊執(zhí)行count--所以就出現(xiàn)了負數(shù)的情況。怎么辦呢?好吧!加鎖吧!
synchronized(lock){
if(count>0)
count--;
}
這就好像上廁所要關(guān)門,除非我運行完我的代碼,否則誰也別想動count!現(xiàn)在正常了!
對于線程這確實是一個極佳的例子,但同時也是一個極佳的反例!這樣寫,能提高程序的效率么?非但不能,還會拖慢程序的執(zhí)行速度,并且增加出錯的概率!寫多線程程序,更多的需要思考,到底什么樣的任務(wù)才是可以同時執(zhí)行且相互不影響的任務(wù),還是以買票為例,讓100個線程賣100個不同航班的票,才是合理的選擇!我們希望cpu干活,而不是在鎖外等待
切記,被鎖住的代碼盡可能短,并且盡可能讓鎖更簡單,否則容易出現(xiàn)死鎖的情況!一個在廁所中沒有紙出不來,一個拿著紙在廁所外大喊:我*啊,**啊!出來啊!!
當(dāng)然,要讓多線程程序高效,另一個關(guān)鍵在于各個線程的負載均衡,設(shè)想如果只有1個cpu在干活,其他cpu都在睡覺那么程序的效率怎么可能提高半分?
在想明白到底什么樣的任務(wù)才是可以同時執(zhí)行且相互不影響的任務(wù)后,模仿erlang的actor機制去實現(xiàn)多線程程序是一種及其簡單切有效的辦法。每個線程維護一個任務(wù)隊列,java中可以用LinkedBlockingQueue,隊列的size即為線程的負載,當(dāng)任務(wù)確定后,根據(jù)負載把任務(wù)加入隊列即可出爐。
每個進程維護一個任務(wù)隊列,java中可以用LinkedBlockingQueue,隊列的size即為線程的負載,當(dāng)任務(wù)確定后,根據(jù)負載把任務(wù)加入隊列即可出爐。
當(dāng)然并行計算本就是一個巨大的話題,本文也只是一個開頭,愿這拋磚引玉能對您有小小的啟示,點擊關(guān)注,我們將勤耕不輟!
我們的文章第一時間在公眾號更新,喜歡請搜索并點擊關(guān)注
、前言
GPU集群的高性能主要歸功于其大規(guī)模并行多核結(jié)構(gòu)、多線程浮點算術(shù)中的高吞吐量,以及使用大型片上緩存顯著減少了大量數(shù)據(jù)移動的時間。我們可以這樣說:GPU集群比傳統(tǒng)的CPU集群具有更好的成本效益。GPU集群不僅在速度性能上有巨大飛躍,而且顯著降低了對空間、能源和冷卻的要求。基于GPU的并行集群系統(tǒng)的各類產(chǎn)品遍布我國的生產(chǎn),生活。本文將介紹GPU的并行集群的技術(shù)和其在我國的發(fā)展?fàn)顩r。
二、GPU集群
圖形處理器GPU善于處理大規(guī)模密集型數(shù)據(jù)和并行數(shù)據(jù),通用并行架構(gòu)CUDA讓GPU在通用計算領(lǐng)域越來越普及。
基于GPGPU的高性能計算主要應(yīng)用與云計算吧,企業(yè)對成本以及效率的要求越來越高,隨著產(chǎn)品的不斷升級,越發(fā)的對橫向和縱向都提出了更高的要求,橫向要求平臺化流程化自動化,縱向要求產(chǎn)品自身性能高端。
服務(wù)器的穩(wěn)定非常重要,一旦出現(xiàn)崩潰等重大異常,將對企業(yè)的應(yīng)用生產(chǎn)和交付產(chǎn)生巨大的影響。
管理 GPU 集群有助于實現(xiàn)最高的目標(biāo) GPU 利用率以及幫助用戶獲得最佳性能。GPU集群的構(gòu)建采用了大量的GPU芯片。在一些Top500系統(tǒng)中,GPU集群已經(jīng)證實能夠達到Pflops級別的性能。
大多數(shù)GPU集群由同構(gòu)GPU構(gòu)建,這些GPU具有相同的硬件類型、制造和模型。GPU集群的軟件包括操作系統(tǒng)、GPU驅(qū)動和集群化API,如MPI。由于GPU集群的高性價比,高性能計算領(lǐng)域中GPU集群的使用越來越普遍。
GPU集群相較于CPU集群,能夠在使用較少操作系統(tǒng)鏡像的情況下正常工作。在電力、環(huán)境和管理復(fù)雜性方面的降低使得GPU集群在未來高性能計算應(yīng)用中非常有吸引力由于GPU集群的高性價比,高性能計算領(lǐng)域中GPU集群的使用越來越普遍,但GPU集群并行編程并沒有一個標(biāo)準(zhǔn)的通信模型,絕大多數(shù)集群應(yīng)用采取CUDA+MPI的方法實現(xiàn),而CUDA和MPI編程都非常困難,需要程序員了解GPU硬件架構(gòu)和MPI消息傳遞機制,顯式控制內(nèi)存與顯存、節(jié)點與節(jié)點間的數(shù)據(jù)傳輸。因此,對編程人員來說,GPU 集群并行編程仍是一個復(fù)雜的問題。
三、GPU的并行集群
目前很成功的產(chǎn)品出現(xiàn)在市場上,如:
1、Platform HPC 由 Platform Computing 公司開發(fā),旨在讓技術(shù)應(yīng)用程序的用戶能夠輕松利用 GPU 高性能計算集群的處理能力和擴展能力。
2、Bright Cluster Manager 是一款完全集成的解決方案,用于部署、測試、提供 (provisioning)、監(jiān)控以及管理 GPU 集群。 憑借 Bright Cluster Manager,集群管理員能夠同時輕松安裝和管理多個集群。
3、PBS Professional 是 Altair 公司的 EAL3+ 安全認證商用級高性能計算工作負荷管理解決方案。 PBS Professional 是所有 PBS Works 解決方案的基礎(chǔ),讓開發(fā)者能夠輕松創(chuàng)建智能政策,以管理分布式多廠商計算資產(chǎn)。
4、Bright Cluster Manager 是一款完全集成的解決方案,用于部署、測試、提供 (provisioning)、監(jiān)控以及管理 GPU 集群。 憑借 Bright Cluster Manager,集群管理員能夠同時輕松安裝和管理多個集群。
5、Ganglia 是一款開源可擴展分布式監(jiān)控系統(tǒng),用于集群與網(wǎng)格 (Grid) 等高性能計算系統(tǒng)。 該系統(tǒng)經(jīng)過了精心的工程設(shè)計,可讓每個節(jié)點實現(xiàn)極低的系統(tǒng)總開銷以及極高的并發(fā)性。 Ganglia 目前已運用在全球數(shù)以千計的集群當(dāng)中,該系統(tǒng)可以擴展,能夠處理具備數(shù)千個節(jié)點的集群。
6、吉浦迅科技與英偉達(NVidia)、惠普(HP)共同合作推出 的HP GPU Starter Kit超算集群測試環(huán)境,提供最高四節(jié)點/8-GPU/4096核,浮點計算能力高達10萬億次的測試環(huán)境,針對國內(nèi)高校、科研單位能夠快速體驗超強的運算速度。
四、結(jié)束語
GPU集群比傳統(tǒng)的CPU集群具有更好的成本效益。GPU集群不僅在速度性能上有巨大飛躍,而且顯著降低了對空間、能源和冷卻的要求。搭建CPU-GPU集群并行計算平臺,集群中每個計算節(jié)點都以CPU為主處理器GPU為協(xié)處理器,將并行數(shù)值計算部分由GPU完成,其余操作由CPU完成。這種技術(shù)已經(jīng)當(dāng)前行業(yè)的必然發(fā)展方向,高性能計算領(lǐng)域中GPU集群的會越來越普遍,為我們的生產(chǎn),生活帶來更好的方向。
行計算(Parallel Computing)
并行計算或稱平行計算是相對于串行計算來說的。并行計算(Parallel Computing)是指同時使用多種計算資源解決計算問題的過程。為執(zhí)行并行計算,計算資源應(yīng)包括一臺配有多處理機(并行處理)的計算機、一個與網(wǎng)絡(luò)相連的計算機專有編號,或者兩者結(jié)合使用。并行計算的主要目的是快速解決大型且復(fù)雜的計算問題。
并行計算可以劃分成時間并行和空間并行。時間并行即流水線技術(shù),空間并行使用多個處理器執(zhí)行并發(fā)計算,當(dāng)前研究的主要是空間的并行問題。以程序和算法設(shè)計人員的角度看,并行計算又可分為數(shù)據(jù)并行和任務(wù)并行。數(shù)據(jù)并行把大的任務(wù)化解成若干個相同的子任務(wù),處理起來比任務(wù)并行簡單。
空間上的并行導(dǎo)致兩類并行機的產(chǎn)生,按照Michael Flynn(費林分類法)的說法分為單指令流多數(shù)據(jù)流(SIMD)和多指令流多數(shù)據(jù)流(MIMD),而常用的串行機也稱為單指令流單數(shù)據(jù)流(SISD)。MIMD類的機器又可分為常見的五類:并行向量處理機(PVP)、對稱多處理機(SMP)、大規(guī)模并行處理機(MPP)、工作站機群(COW)、分布式共享存儲處理機(DSM)。
2. 分布式計算(Distributed Computing)
分布式計算這個研究領(lǐng)域,主要研究分散系統(tǒng)(Distributed system)如何進行計算。分散系統(tǒng)是一組計算機,通過計算機網(wǎng)絡(luò)相互鏈接與通信后形成的系統(tǒng)。把需要進行大量計算的工程數(shù)據(jù)分區(qū)成小塊,由多臺計算機分別計算,在上傳運算結(jié)果后,將結(jié)果統(tǒng)一合并得出數(shù)據(jù)結(jié)論的科學(xué)。
目前常見的分布式計算項目通常使用世界各地上千萬志愿者計算機的閑置計算能力,通過互聯(lián)網(wǎng)進行數(shù)據(jù)傳輸。如分析計算蛋白質(zhì)的內(nèi)部結(jié)構(gòu)和相關(guān)藥物的Folding@home項目,該項目結(jié)構(gòu)龐大,需要驚人的計算量,由一臺電腦計算是不可能完成的。即使現(xiàn)在有了計算能力超強的超級電腦,但是一些科研機構(gòu)的經(jīng)費卻又十分有限。
分布式計算比起其它算法具有以下幾個優(yōu)點:
1、稀有資源可以共享。
2、通過分布式計算可以在多臺計算機上平衡計算負載。
3、可以把程序放在最適合運行它的計算機上。其中,共享稀有資源和平衡負載是計算機分布式計算的核心思想之一。
3. 并行計算與分布式計算的區(qū)別
并行計算與分布式計算都是運用并行來獲得更高性能,化大任務(wù)為小任務(wù)。簡單說來,如果處理單元共享內(nèi)存,就稱為并行計算,反之就是分布式計算。也有人認為分布式計算是并行計算的一種特例。
但是分布式的任務(wù)包互相之間有獨立性,上一個任務(wù)包的結(jié)果未返回或者是結(jié)果處理錯誤,對下一個任務(wù)包的處理幾乎沒有什么影響。因此,分布式的實時性要求不高,而且允許存在計算錯誤(因為每個計算任務(wù)給好幾個參與者計算,上傳結(jié)果到服務(wù)器后要比較結(jié)果,然后對結(jié)果差異大的進行驗證。
分布式要處理的問題一般是基于“尋找”模式的。所謂的“尋找”,就相當(dāng)于窮舉法!為了嘗試到每一個可能存在的結(jié)果,一般從0~N( 某一數(shù)值)被一個一個的測試,直到我們找到所要求的結(jié)果。事實上,為了易于一次性探測到正確的結(jié)果,我們假設(shè)結(jié)果是以某個特殊形式開始的。在這種類型的搜索里,我們也許幸運的一開始就找到答案;也許不夠走運以至于到最后才找到答案,這都很公平。
這么說,并行程序并行處理的任務(wù)包之間有很大的聯(lián)系,而且并行計算的每一個任務(wù)塊都是必要的,沒有浪費的分割的,就是每個任務(wù)包都要處理,而且計算結(jié)果相互影響,就要求每個的計算結(jié)果要絕對正確,而且在時間上要盡量做到同步,而分布式的很多任務(wù)塊可以根本就不處理,有大量的無用數(shù)據(jù)塊,所以說分布式計算的速度盡管很快,但是真正的“效率”是低之再低 的,可能一直在尋找,但是永遠都找不到,也可能一開始就找到了;而并行處理不同,它的任務(wù)包個數(shù)相對有限,在一個有限的時間應(yīng)該是可能完成的。
分布式的編寫一般用的是C++(也有用JAVA的,但是都不是主流),基本不用MPI接口。并行計算用MPI或者OpenMP。
4. 集群計算(Cluster Computing)
計算機集群將一組松散集成的計算機軟件或硬件連接起來高度緊密地協(xié)作完成計算工作。在某種意義上,他們可以被看作是一臺計算機。集群系統(tǒng)中的單個計算機通常稱為節(jié)點,通常通過局域網(wǎng)連接,但也有其它的可能連接方式。集群計算機通常用來改進單個計算機的計算速度和/或可靠性。一般情況下集群計算機比單個計算機,比如工作站或超級計算機性價比要高得多。
根據(jù)組成集群系統(tǒng)的計算機之間體系結(jié)構(gòu)是否相同,集群可分為同構(gòu)與異構(gòu)兩種。集群計算機按功能和結(jié)構(gòu)可以分為,高可用性集群(High-availability (HA) clusters)、負載均衡集群(Loadbalancing clusters)、高性能計算集群(High-performance (HPC)clusters)、網(wǎng)格計算(Grid computing)。
高可用性集群,一般是指當(dāng)集群中有某個節(jié)點失效的情況下,其上的任務(wù)會自動轉(zhuǎn)移到其他正常的節(jié)點上。還指可以將集群中的某節(jié)點進行離線維護再上線,該過程并不影響整個集群的運行。
負載均衡集群,負載均衡集群運行時,一般通過一個或者多個前端負載均衡器,將工作負載分發(fā)到后端的一組服務(wù)器上,從而達到整個系統(tǒng)的高性能和高可用性。這樣的計算機集群有時也被稱為服務(wù)器群(Server Farm)。一般高可用性集群和負載均衡集群會使用類似的技術(shù),或同時具有高可用性與負載均衡的特點。Linux虛擬服務(wù)器(LVS)項目在Linux操作系統(tǒng)上提供了最常用的負載均衡軟件。
高性能計算集群,高性能計算集群采用將計算任務(wù)分配到集群的不同計算節(jié)點兒提高計算能力,因而主要應(yīng)用在科學(xué)計算領(lǐng)域。比較流行的HPC采用Linux操作系統(tǒng)和其它一些免費軟件來完成并行運算。這一集群配置通常被稱為Beowulf集群。這類集群通常運行特定的程序以發(fā)揮HPC cluster的并行能力。這類程序一般應(yīng)用特定的運行庫, 比如專為科學(xué)計算設(shè)計的MPI庫。HPC集群特別適合于在計算中各計算節(jié)點之間發(fā)生大量數(shù)據(jù)通訊的計算作業(yè),比如一個節(jié)點的中間結(jié)果或影響到其它節(jié)點計算結(jié)果的情況。
5. 網(wǎng)格計算(Grid Computing)
網(wǎng)格計算是分布式計算的一種,也是一種與集群計算非常相關(guān)的技術(shù)。如果我們說某項工作是分布式的,那么,參與這項工作的一定不只是一臺計算機,而是一個計算機網(wǎng)絡(luò),顯然這種“螞蟻搬山”的方式將具有很強的數(shù)據(jù)處理能力。網(wǎng)格計算的實質(zhì)就是組合與共享資源并確保系統(tǒng)安全。
網(wǎng)格計算通過利用大量異構(gòu)計算機的未用資源(CPU周 期和磁盤存儲),將其作為嵌入在分布式電信基礎(chǔ)設(shè)施中的一個虛擬的計算機集群,為解決大規(guī)模的計算問題提供一個模型。網(wǎng)格計算的焦點放在支持跨管理域計算 的能力,這使它與傳統(tǒng)的計算機集群或傳統(tǒng)的分布式計算相區(qū)別。網(wǎng)格計算的目標(biāo)是解決對于任何單一的超級計算機來說仍然大得難以解決的問題,并同時保持解決 多個較小的問題的靈活性。這樣,網(wǎng)格計算就提供了一個多用戶環(huán)境。
6. 集群計算與網(wǎng)格計算的區(qū)別
(1)簡單地,網(wǎng)格與傳統(tǒng)集群的主要差別是網(wǎng)格是連接一組相關(guān)并不信任的計算機,它的運作更像一個計算公共設(shè)施而不是一個獨立的計算機。網(wǎng)格通常比集群支持更多不同類型的計算機集合。
(2)網(wǎng)格本質(zhì)上就是動態(tài)的,集群包含的處理器和資源的數(shù)量通常都是靜態(tài)的。在網(wǎng)格上,資源則可以動態(tài)出現(xiàn),資源可以根據(jù)需要添加到網(wǎng)格中或從網(wǎng)格中刪除。
(3)網(wǎng)格天生就是在本地網(wǎng)、城域網(wǎng)或廣域網(wǎng)上進行分布的。網(wǎng)格可以分布在任何地方。而集群物理上都包含在一個位置的相同地方,通常只是局域網(wǎng)互連。集群互連技 術(shù)可以產(chǎn)生非常低的網(wǎng)絡(luò)延時,如果集群距離很遠,這可能會導(dǎo)致產(chǎn)生很多問題。物理臨近和網(wǎng)絡(luò)延時限制了集群地域分布的能力,而網(wǎng)格由于動態(tài)特性,可以提供 很好的高可擴展性。
(4)集群僅僅通過增加服務(wù)器滿足增長的需求。然而,集群的服務(wù)器數(shù)量、以及由此導(dǎo)致的集群性能是有限的:互連網(wǎng)絡(luò)容量。也就是說如果一味地想通過擴大規(guī)模來提高集群計算機的性能,它的性價比會相應(yīng)下降,這意味著我們不可能無限制地擴大集群的規(guī)模。 而網(wǎng)格虛擬出空前的超級計算機,不受規(guī)模的限制,成為下一代Internet的發(fā)展方向。
(5)集群和網(wǎng)格計算是相互補充的。很多網(wǎng)格都在自己管理的資源中采用了集群。實際上,網(wǎng)格用戶可能并不清楚他的工作負載是在一個遠程的集群上執(zhí)行的。盡管網(wǎng)格與集群之間存在很多區(qū)別,但是這些區(qū)別使它們構(gòu)成了一個非常重要的關(guān)系,因為集群在網(wǎng)格中總有一席之地—— 特定的問題通常都需要一些緊耦合的處理器來解決。然而,隨著網(wǎng)絡(luò)功能和帶寬的發(fā)展,以前采用集群計算很難解決的問題現(xiàn)在可以使用網(wǎng)格計算技術(shù)解決了。理解網(wǎng)格固有的可擴展性和集群提供的緊耦合互連機制所帶來的性能優(yōu)勢之間的平衡是非常重要的。
7. 云計算(Cloud Computing)
云計算是最新開始的新概念,它不只是計算等計算機概念,還有運營服務(wù)等概念了。它是分布式計算、并行計算和網(wǎng)格計算的發(fā)展,或者說是這些概念的商業(yè)實現(xiàn)。云計算不但包括分布式計算還包括分布式存儲和分布式緩存。分布式存儲又包括分布式文件存儲和分布式數(shù)據(jù)存儲。
8. 云計算與并行、分布式、網(wǎng)格和集群計算的區(qū)別
云計算是從集群技術(shù)發(fā)展而來,區(qū)別在于集群雖然把多臺機器聯(lián)了起來,但其某項具體任務(wù)執(zhí)行的時候還是會被轉(zhuǎn)發(fā)到某臺服務(wù)器上,而云可以簡單的認為是任務(wù)可以被分割成多個進程在多臺服務(wù)器上并行計算,然后得到結(jié)果,好處在于大數(shù)據(jù)量的操作性能非常好。云可以使用廉價的PC服務(wù)器 ,可以管理大數(shù)據(jù)量與大集群,關(guān)鍵技術(shù)在于能夠?qū)υ苾?nèi)的基礎(chǔ)設(shè)施進行動態(tài)按需分配與管理。云計算與并行計算、分布式計算的區(qū)別,以計算機用戶來說,并行計算是由單個用戶完成的,分布式計算是由多個用戶合作完成的,云計算是沒有用戶參與,而是交給網(wǎng)絡(luò)另一端的服務(wù)器完成的。