現(xiàn)在 Linux 集群在很多領(lǐng)域都已經(jīng)變得非常流行了。隨著集群技術(shù)的出現(xiàn)以及開放源碼軟件日益得到采納,現(xiàn)在只需要傳統(tǒng)高性能機(jī)器的很少一部分成本就可以構(gòu)建一臺(tái)超級(jí)計(jì)算機(jī)了。 這兩篇系列文章簡(jiǎn)要介紹采用 Linux 集群技術(shù)的高性能計(jì)算(HPC)的概念,展示如何構(gòu)建集群并編寫并行程序。本文是兩篇系列文章中的第一篇,討論了集群的類型、用途、HPC 基礎(chǔ)、Linux 在 HPC 中的角色以及集群技術(shù)日益增長(zhǎng)的原因。第 2 部分將介紹并行算法的知識(shí),并介紹如何編寫并行程序、如何構(gòu)建集群以及如何進(jìn)行基準(zhǔn)測(cè)試。 大部分 HPC 系統(tǒng)都使用了并行 的概念。有很多軟件平臺(tái)都是面向 HPC 的,但是首先讓我們先來了解一下硬件的知識(shí)。 HPC 硬件可以分為 3 類:
SMP 是 HPC 采用的體系架構(gòu)之一,其中有多個(gè)處理器會(huì)共享內(nèi)存。(在集群中,這也稱為 大規(guī)模并行處理器(massively parallel processor,MPP),它們并不需要共享內(nèi)存;稍后我們將更詳細(xì)介紹這方面的內(nèi)容。)與 MPP 相比,SMP 通常成本更高,而且可伸縮性較差。 顧名思義,在向量處理器中,CPU 被優(yōu)化以便很好地處理向量數(shù)組的運(yùn)算。向量處理器系統(tǒng)的性能很高,在 20 世紀(jì) 80 年代到 90 年代早期一度在 HPC 體系架構(gòu)中占有統(tǒng)治地位,但是最近幾年以來,集群變得更加流行了。 集群是最近幾年中最為主要的一種 HPC 硬件:集群(cluster) 就是一組 MPP 的集合。集群中的處理器通常被稱為 節(jié)點(diǎn),它具有自己的 CPU、內(nèi)存、操作系統(tǒng)、I/O 子系統(tǒng),并且可以與其他節(jié)點(diǎn)進(jìn)行通信。目前有很多地方都使用常見的工作站運(yùn)行 Linux 和其他開放源碼軟件來充當(dāng)集群中的節(jié)點(diǎn)。 接下來您將看到這些 HPC 硬件之間的區(qū)別,但是首先讓我們從集群開始。
術(shù)語(yǔ)“集群(cluster)”在不同的地方可能會(huì)意味著不同的意義。本文重點(diǎn)介紹以下三種類型的集群:
最簡(jiǎn)單的故障遷移集群有兩個(gè)節(jié)點(diǎn):一個(gè)節(jié)點(diǎn)是活動(dòng)的,另外一個(gè)節(jié)點(diǎn)是備用的,不過它會(huì)一直對(duì)活動(dòng)節(jié)點(diǎn)進(jìn)行監(jiān)視。一旦活動(dòng)節(jié)點(diǎn)出現(xiàn)故障,備用節(jié)點(diǎn)就會(huì)接管它的工作,這樣就能使得關(guān)鍵的系統(tǒng)能夠持續(xù)工作。 負(fù)載均衡集群通常會(huì)在非常繁忙的 Web 站點(diǎn)上采用,它們有多個(gè)節(jié)點(diǎn)來承擔(dān)相同站點(diǎn)的工作,每個(gè)獲取 Web 頁(yè)面的新請(qǐng)求都被動(dòng)態(tài)路由到一個(gè)負(fù)載較低的節(jié)點(diǎn)上。 高性能集群用來運(yùn)行那些對(duì)時(shí)間敏感的并行程序,它們對(duì)于科學(xué)社區(qū)來說具有特殊的意義。高性能集群通常會(huì)運(yùn)行一些模擬程序和其他對(duì) CPU 非常敏感的程序,這些程序在普通的硬件上運(yùn)行需要花費(fèi)大量的時(shí)間。 圖 1 解釋了一個(gè)基本的集群。本系列文章的第 2 部分將展示如何創(chuàng)建這種集群,并為其編寫程序。 圖 1. 基本的集群 ![]() 網(wǎng)格計(jì)算 是一個(gè)更為廣泛的術(shù)語(yǔ),通常用來代表利用松耦合系統(tǒng)之間的協(xié)作來實(shí)現(xiàn)面向服務(wù)的架構(gòu)(SOA)。基于集群的 HPC 是網(wǎng)格計(jì)算的一個(gè)特例,其中節(jié)點(diǎn)之間都是緊耦合的。網(wǎng)格計(jì)算的一個(gè)成功的、眾所周知的項(xiàng)目是 SETI@home,即搜索外星智慧的項(xiàng)目,它使用了大約一百萬臺(tái)家用 PC 在屏保時(shí)的空閑 CPU 周期來分析無線電天文望遠(yuǎn)鏡的數(shù)據(jù)。另外一個(gè)類似的成功項(xiàng)目是 Folding@Home 項(xiàng)目,用來進(jìn)行蛋白質(zhì)的折疊計(jì)算。
幾乎所有的產(chǎn)業(yè)界都需要快速的處理能力。隨著越來越便宜而且快速的計(jì)算機(jī)的出現(xiàn),更多公司表現(xiàn)出了對(duì)利用這些技術(shù)優(yōu)勢(shì)的興趣。人們對(duì)于計(jì)算處理能力的需求是沒有上限的;盡管處理能力在迅速提高,但是人們的需求仍然超出計(jì)算能力所能提供的范圍。 蛋白質(zhì)分子是非常復(fù)雜的鏈,實(shí)際上可以表示為無數(shù)個(gè) 3D 圖形。實(shí)際上,在將蛋白質(zhì)放到某種溶液中時(shí),它們會(huì)快速“折疊”成自己的自然狀態(tài)。不正確的折疊會(huì)導(dǎo)致很多疾病,例如 Alzheimer ??;因此,對(duì)于蛋白質(zhì)折疊的研究非常重要。 科學(xué)家試圖理解蛋白質(zhì)折疊的一種方式是通過在計(jì)算機(jī)上進(jìn)行模擬。實(shí)際上,蛋白質(zhì)的折疊進(jìn)行得非常迅速(可能只需要 1 微秒),不過這個(gè)過程卻非常復(fù)雜,這個(gè)模擬在普通的計(jì)算機(jī)上可能需要運(yùn)行 10 年。這個(gè)領(lǐng)域只不過是諸多業(yè)界領(lǐng)域中很小的一個(gè),但是它卻需要非常強(qiáng)大的計(jì)算能力。 業(yè)界中其他領(lǐng)域包括制藥建模、虛擬外科手術(shù)訓(xùn)練、環(huán)境和診斷虛擬化、完整的醫(yī)療記錄數(shù)據(jù)庫(kù)以及人類基因項(xiàng)目。 震動(dòng)圖中包含有大陸和洋底內(nèi)部特性的詳細(xì)信息,對(duì)這些數(shù)據(jù)進(jìn)行分析可以幫助我們探測(cè)石油和其他資源。即便對(duì)于一個(gè)很小的區(qū)域來說,也有數(shù)以 TB 計(jì)的數(shù)據(jù)需要重構(gòu);這種分析顯然需要大量的計(jì)算能力。這個(gè)領(lǐng)域?qū)τ谟?jì)算能力的需求是如此旺盛,以至于超級(jí)計(jì)算機(jī)大部分都是在處理這種工作。 其他地理學(xué)方面的研究也需要類似的計(jì)算能力,例如用來預(yù)測(cè)地震的系統(tǒng),用于安全性工作的多譜段衛(wèi)星成像系統(tǒng)。 在工程領(lǐng)域(例如航天引擎設(shè)計(jì))操縱高分辨率的交互式圖像在性能和可伸縮性方面歷來都是一種挑戰(zhàn),因?yàn)檫@要涉及大量的數(shù)據(jù)?;诩旱募夹g(shù)在這些領(lǐng) 域已經(jīng)取得了成功,它們將渲染屏幕的任務(wù)分割到集群中的各個(gè)節(jié)點(diǎn)上,在每個(gè)節(jié)點(diǎn)上都利用自己的圖形硬件來呈現(xiàn)自己這部分屏幕的圖像,并將這些像素信息傳送 到一個(gè)主節(jié)點(diǎn)上,主節(jié)點(diǎn)對(duì)這些信息進(jìn)行組合,最終形成一個(gè)完整的圖像。 這個(gè)領(lǐng)域中的例子目前才不過是冰山一角;更多的應(yīng)用程序,包括天體物理模擬、氣象模擬、工程設(shè)計(jì)、金融建模、證券模擬以及電影特技,都需要豐富的計(jì)算資源。對(duì)于計(jì)算能力越來越多的需求我們就不再進(jìn)行介紹了。
在基于集群的計(jì)算技術(shù)出現(xiàn)之前,典型的超級(jí)計(jì)算機(jī)都是向量處理器,由于它們?nèi)坎捎脤S玫挠布蛙浖?,因此成本通常?huì)超過一百萬美元。 隨著 Linux 和其他免費(fèi)的集群開放源碼軟件組件的出現(xiàn)和常用硬件處理能力的提高,這種情況現(xiàn)在已經(jīng)發(fā)生了很大的變化。您可以利用少量的成本來構(gòu)建功能強(qiáng)大的集群,并能夠根據(jù)需要來添加其他節(jié)點(diǎn)。 GNU/Linux 操作系統(tǒng)(Linux)已經(jīng)在集群中得到了大量的采用。Linux 可以在很多硬件上運(yùn)行,并且具有高質(zhì)量的編譯器和其他軟件,例如并行文件系統(tǒng)和 MPI 實(shí)現(xiàn)在 Linux 上都是免費(fèi)的。采用 Linux,用戶還可以針對(duì)自己的任務(wù)負(fù)載對(duì)內(nèi)核進(jìn)行定制。Linux 是構(gòu)建 HPC 集群的一個(gè)非常好的平臺(tái)。
要理解 HPC 硬件,對(duì)向量計(jì)算和集群計(jì)算進(jìn)行一下比較是非常有用的。二者是互相競(jìng)爭(zhēng)的技術(shù)(地球模擬器 是一臺(tái)向量超級(jí)計(jì)算機(jī),目前仍然是最快的 10 臺(tái)機(jī)器之一)。 從根本上來講,向量處理器和標(biāo)量處理器都是基于時(shí)鐘周期來執(zhí)行指令的;使它們產(chǎn)生區(qū)別的是向量處理器并行處理與向量有關(guān)的計(jì)算的能力(例如矩陣乘法),這在高性能計(jì)算中是非常常見的。為了展示這一點(diǎn),假設(shè)您有兩個(gè)雙精度的數(shù)組 a 和 b,并且要?jiǎng)?chuàng)建第三個(gè)數(shù)組 x,比如 x[i]=a[i]+b[i]。 任何浮點(diǎn)操作,例如加法和乘法,都可以通過幾個(gè)步驟來實(shí)現(xiàn):
向量處理器通過使用 流水線(pipeline) 技術(shù)在內(nèi)部對(duì)這些步驟進(jìn)行并行處理。假設(shè)在一個(gè)浮點(diǎn)加法運(yùn)算中有六個(gè)步驟(與 IEEE 算術(shù)硬件一樣),如圖 2 所示: 圖 2. IEEE 算術(shù)硬件中的六級(jí)流水線 ![]() 向量處理器可以并行處理這六個(gè)步驟 —— 如果第 i 個(gè)數(shù)組元素是在第 4 個(gè)步驟中被添加的,那么向量處理器就會(huì)為第 (i+1) 個(gè)元素執(zhí)行第 3 個(gè)步驟,為第 (i+2) 個(gè)元素執(zhí)行第 2 個(gè)步驟,依此類推。正如您可以看到的一樣,對(duì)于一個(gè) 6 級(jí)的浮點(diǎn)加運(yùn)算來說,加速比非常接近于 6(在開始和結(jié)束時(shí),這六個(gè)步驟并不是都處于活動(dòng)狀態(tài)的),因?yàn)樵谌魏谓o定的時(shí)刻(圖 2 所示的紅色),這些步驟都是活動(dòng)的。這樣做的一大優(yōu)點(diǎn)是并行處理都是在幕后進(jìn)行的,您并不需要在程序中顯式地進(jìn)行編碼。 對(duì)于大部分情況來說,這六個(gè)步驟都可以并行執(zhí)行,這樣就可以獲得幾乎 6 倍的性能提高。箭頭表示了對(duì)第 i 個(gè)數(shù)組元素所進(jìn)行的操作。 與向量處理相比,基于集群的計(jì)算采用的是完全不同的一種方法。它不使用專門優(yōu)化過的向量硬件,而是使用標(biāo)準(zhǔn)的標(biāo)量處理器,但是它采用了大量的處理器來并行處理多個(gè)計(jì)算任務(wù)。 集群的特性如下:
當(dāng)在集群上實(shí)現(xiàn)高性能環(huán)境時(shí),軟件和硬件就需要聯(lián)合起來工作。程序在編寫時(shí)必須要顯式地利用底層硬件的優(yōu)點(diǎn),如果現(xiàn)有的非并行程序不能很好地在集群上運(yùn)行,那么這些程序必須重新進(jìn)行編寫。 并行程序一次要執(zhí)行很多操作。其數(shù)量取決于目前正在解決的問題。假設(shè)一個(gè)程序所花費(fèi)的時(shí)間中有 1/N 是不能并行處理的,那么剩余的 (1-1/N) 就是可以并行處理的部分(請(qǐng)參看圖 3)。 圖 3. Amdahl 法則 ![]() 從理論上來說,您可以采用無數(shù)的硬件來處理并行執(zhí)行的部分,甚至在接近 0 的時(shí)間內(nèi)完成這些任務(wù),但是對(duì)于串行部分來說,這樣做不會(huì)有任何提高。結(jié)果是,可以實(shí)現(xiàn)的最佳結(jié)果是使用原來的 1/N 的時(shí)間來執(zhí)行整個(gè)程序,但是不可能再快了。在并行編程中,這個(gè)事實(shí)通常就稱為 Amdahl 法則。 Amdahl 法則揭示了使用并行處理器來解決問題與只使用一個(gè)串行處理器來解決問題的加速比。加速比(speedup) 的定義如下:(使用多個(gè)處理器)并行執(zhí)行程序所需要的時(shí)間除以(使用一個(gè)處理器)串行執(zhí)行程序所需要的時(shí)間:
其中 T(j) 是在使用 j 個(gè)處理器來執(zhí)行程序時(shí)所需要的時(shí)間。 在圖 3 中,如果采用足夠多的節(jié)點(diǎn)來進(jìn)行并行處理,那么 T'par 就可以非常接近于 0,但是 Tseq 卻不會(huì)變化。在最好的情況中,并行程序也不可能快到原來的 1+Tpar/Tseq。 在編寫并行程序時(shí)真正困難的事情是使 N 盡量大。但是這件事情卻有兩面性。通常都是要試圖在更為強(qiáng)大的計(jì)算機(jī)上來解決更大的問題,通常隨著所解決問題的規(guī)模的增大(例如試圖修改程序并提高可并行 的部分來優(yōu)化地利用可用資源),所花費(fèi)在串行部分上的時(shí)間就會(huì)減少。因此,N 值就會(huì)自動(dòng)變大了。(請(qǐng)參看本文后面 參考資料 部分所給出的 Amdhal 法則推論。)
現(xiàn)在讓我們介紹兩種并行編程的方法:分布式內(nèi)存方法 和 共享式內(nèi)存方法。 此處我們考慮一種主從模式非常有用:
顯然,這種方法的問題就產(chǎn)生于分布式內(nèi)存的組織。由于每個(gè)節(jié)點(diǎn)都只能訪問自己的內(nèi)存,如果其他節(jié)點(diǎn)需要訪問這些內(nèi)存中的數(shù)據(jù),就必須對(duì)這些數(shù)據(jù)結(jié)構(gòu)進(jìn)行復(fù)制并通過網(wǎng)絡(luò)進(jìn)行傳送,這會(huì)導(dǎo)致大量的網(wǎng)絡(luò)負(fù)載。要編寫有效的分布式內(nèi)存的程序,就必須牢記這個(gè)缺點(diǎn)和主從模型。 在共享式內(nèi)存方法中,內(nèi)存對(duì)于所有的處理器(例如 SMP)來說都是通用的。這種方法并沒有分布式內(nèi)存方法中所提到的那些問題。而且對(duì)于這種系統(tǒng)進(jìn)行編程要簡(jiǎn)單很多,因?yàn)樗械臄?shù)據(jù)對(duì)于所有的處理器來說都 是可以使用的,這與串行程序并沒有太多區(qū)別。這些系統(tǒng)的一個(gè)大問題是可伸縮能力:不容易添加其他處理器。 并行編程(與所有的編程技術(shù)一樣)與其他科學(xué)一樣,都是一門藝術(shù),總會(huì)留下一定的空間來進(jìn)行設(shè)計(jì)的改進(jìn)和性能的提高。并行編程在計(jì)算中有自己特殊的地位:本系列文章的第 2 部分將介紹并行編程平臺(tái),并給出幾個(gè)例子。
有些應(yīng)用程序通常會(huì)需要從磁盤中讀寫大量的數(shù)據(jù),這通常是整個(gè)計(jì)算過程中速度最慢的一個(gè)步驟。更快的硬盤驅(qū)動(dòng)器能夠幫助解決一些問題,但是有時(shí)這是不夠的。 如果一個(gè)物理磁盤分區(qū)是在所有節(jié)點(diǎn)之間共享的(例如使用 NFS),就像是在 Linux 集群中經(jīng)常采用的方法一樣,那么這個(gè)問題就會(huì)變得更加明顯了。此時(shí)就是并行文件系統(tǒng)的用武之地了。 并行文件系統(tǒng)(Parallel filesystem) 將數(shù)據(jù)存放在分布在多個(gè)磁盤上的文件中,這些磁盤連接到集群中的多個(gè)節(jié)點(diǎn)上,這些節(jié)點(diǎn)稱為 I/O 節(jié)點(diǎn)。當(dāng)一個(gè)程序試圖讀取某個(gè)文件時(shí),可以并行地從多塊磁盤上分別讀取這個(gè)文件的某些部分。這可以降低某個(gè)磁盤控制器上的負(fù)載,并能夠處理更多請(qǐng) 求。(PVFS 就是一個(gè)很好的開放源碼并行文件系統(tǒng);目前已經(jīng)在 Linux 集群上使用標(biāo)準(zhǔn)的 IDE 硬盤實(shí)現(xiàn)了超過 1 GB/s 的磁盤性能。) PVFS 可以作為一個(gè) Linux 內(nèi)核模塊使用,也可以編譯到 Linux 內(nèi)核中。底層的概念非常簡(jiǎn)單(請(qǐng)參看圖 4):
圖 4. PVFS 是如何工作的 ![]() 當(dāng)集群中的計(jì)算節(jié)點(diǎn)想要訪問并行文件系統(tǒng)中的一個(gè)文件時(shí),它需要執(zhí)行以下步驟:
這些步驟對(duì)于調(diào)用應(yīng)用程序來說都是透明的;底層對(duì)所有 I/O 節(jié)點(diǎn)發(fā)出請(qǐng)求的復(fù)雜性、獲取文件的內(nèi)容等等,都是由 PVFS 處理的。
有關(guān) PVFS 有一件好的事情:不需做任何修改就可以在其上運(yùn)行普通文件系統(tǒng)的二進(jìn)制形式 —— 這在并行編程領(lǐng)域多少是個(gè)例外。(參考資料 中介紹了其他一些并行文件系統(tǒng)。) 本系列的第 1 篇 集群基礎(chǔ) 討論了集群的類型、用途、HPC 基礎(chǔ)以及集群技術(shù)在 HPC 領(lǐng)域變得更加流行的原因。 本文介紹了并行算法,并介紹了如何編寫并行程序、構(gòu)建集群以及對(duì)集群進(jìn)行基準(zhǔn)測(cè)試。我們將介紹如何使用 MPI 進(jìn)行并行編程,以及構(gòu)建 Linux 集群的基礎(chǔ)知識(shí)。在本文中,我們將會(huì)介紹有關(guān) OSCAR 的內(nèi)容,這是一個(gè)用來幫助構(gòu)建健壯集群的開放源碼項(xiàng)目。另外,我們還會(huì)概要介紹集群管理和基準(zhǔn)測(cè)試的概念,并詳細(xì)介紹在集群上運(yùn)行標(biāo)準(zhǔn) LINPACK 測(cè)試的步驟。 如果已經(jīng)安裝好了 Linux,在閱讀本文之后,就可以安裝 Linux 集群并進(jìn)行故障排除了。下面的 參考資料 中給出的鏈接可以幫助您學(xué)習(xí)更多有關(guān)集群的知識(shí)。 正如在 第 1 部分 中可以看到的一樣,HPC 大部分都是有關(guān)并行編程的。并行編程是一個(gè)發(fā)展相當(dāng)完善的領(lǐng)域,在過去 20 年中,已經(jīng)開發(fā)出了多種編程平臺(tái)和標(biāo)準(zhǔn)。 HPC 中使用的兩種主要的硬件平臺(tái)是共享內(nèi)存系統(tǒng)和分布式內(nèi)存系統(tǒng)。詳細(xì)信息請(qǐng)參閱 第 1 部分。 在共享內(nèi)存系統(tǒng) 中,High Performance FORTRAN 是一種非常適合并行編程的語(yǔ)言。它可以有效地利用數(shù)據(jù)的并行,并將其作為一個(gè)整體數(shù)組在不同處理器上使用不同的索引來同時(shí)執(zhí)行指令。因此,這只需要最少的 努力就可以提供自動(dòng)的并行處理能力。(Jamaica 項(xiàng)目就是這樣一個(gè)例子,標(biāo)準(zhǔn)的 Java 程序可以使用特殊的編譯器進(jìn)行重構(gòu)來生成多線程的代碼。然后所生成的代碼就可以自動(dòng)利用 SMP 體系架構(gòu)的優(yōu)點(diǎn),并可以并行執(zhí)行了。) 在分布式內(nèi)存系統(tǒng) 上,情況會(huì)有根本的不同,這是因?yàn)閮?nèi)存是分布式的;必須編寫能夠理解硬件底層的分布式特性的代碼,并且需要顯式地使用消息傳遞在不同的節(jié)點(diǎn)之間交換信息。 并行虛擬機(jī)(PVM)曾經(jīng)是一個(gè)非常流行的并行編程平臺(tái),但是最近 MPI 已經(jīng)成為了為集群編寫并行程序的事實(shí)標(biāo)準(zhǔn)。 為 Linux 上 FORTRAN、C 和 C++ 使用的高質(zhì)量的 MPI 實(shí)現(xiàn)可以免費(fèi)獲得。流行的 MPI 實(shí)現(xiàn)有兩個(gè):
在本文稍后的部分中,我們將構(gòu)建一個(gè)基于 MPICH 的 Linux 集群,并來看一個(gè)基于 MPI 的程序例子。
創(chuàng)建一個(gè)簡(jiǎn)單的 Linux 集群 有關(guān)集群最有趣的事情之一是,如果我們有基本的 Linux 安裝,并且具備一定的故障排除的技能,只需要很少的努力就可以構(gòu)建基于 Linux 的集群。讓我們來看一下這是如何實(shí)現(xiàn)的。 對(duì)于我們的集群,要使用 MPICH 和一組普通的 Linux 工作站。為了簡(jiǎn)單起見,并且重點(diǎn)突出其中的基本原理,我們將構(gòu)建最小的裸系統(tǒng),在集群環(huán)境中可以使用它來運(yùn)行并行程序。 本節(jié)中給出的 7 個(gè)步驟將顯示如何構(gòu)建裸系統(tǒng)。構(gòu)建健壯的集群以及集群的管理涉及很多工作,我們?cè)诒疚暮竺孢M(jìn)行介紹。 如果想獲得一個(gè)真正的集群,至少需要兩臺(tái) Linux 機(jī)器。兩個(gè) VMware 映像也可以很好地實(shí)現(xiàn)這種功能。(使用 VMware,顯然我們并不會(huì)期望能獲得什么性能優(yōu)勢(shì)。實(shí)際上,其性能顯然會(huì)有所下降,因?yàn)?CPU 需要進(jìn)行共享。)請(qǐng)確保這些機(jī)器彼此之間可以使用機(jī)器名相互 ping 通。否則,就需要在 /etc/hosts 中添加適當(dāng)?shù)捻?xiàng)。 安裝 GNU C 編譯器和 GNU FORTRAN 編譯器。
為所有節(jié)點(diǎn)配置 SSH,允許不詢問密碼就可以執(zhí)行命令。這樣做的目的是能夠不需詢問密碼就可以執(zhí)行
如果正在以 root 用戶的身份構(gòu)建集群,并且以 root 用戶的身份來運(yùn)行程序(顯然只有在進(jìn)行實(shí)驗(yàn)時(shí)才會(huì)這樣),那么就可以將私鑰拷貝到文件 /root/.ssh/identity 中,并將公鑰拷貝到集群中所有節(jié)點(diǎn)上的 /root/.ssh/authorized_keys 文件中。
為了確保所有的配置都能正常工作,請(qǐng)執(zhí)行下面的命令: 注意:可能還需要修改防火墻的配置,使其允許節(jié)點(diǎn)彼此之間相互進(jìn)行通信。 接下來,我們將安裝 MPICH。從 anl.gov 的 Web 站點(diǎn)(請(qǐng)參閱 參考資料 中的鏈接)上下載 UNIX 版本的 MPICH。下面是一個(gè)簡(jiǎn)要介紹。 假設(shè)您已經(jīng)將所下載的 mpich.tar.gz 放到了 /tmp 中:
要讓 MPICH 知道所有的節(jié)點(diǎn),請(qǐng)編輯文件 /tmp/mpich-1.2.6/util/machines/machines.LINUX,并將所有節(jié)點(diǎn)的主機(jī)名添加到這個(gè)文件中,這樣安裝的 MPICH 就可以知道所有的節(jié)點(diǎn)了。如果以后再添加新的節(jié)點(diǎn),也請(qǐng)修改這個(gè)文件。 將目錄 /tmp/mpich-1.2.6 拷貝到集群中的所有節(jié)點(diǎn)上。 在 examples 中運(yùn)行幾個(gè)測(cè)試程序:
現(xiàn)在集群已經(jīng)準(zhǔn)備好了!正如我們可以看到的一樣,所有的重頭戲都可以留給 MPI 實(shí)現(xiàn)來完成。正如前面介紹的一樣,這是一個(gè)裸集群,所需的大部分手工工作只是確保機(jī)器之間可以彼此進(jìn)行通信(我們配置了 ssh,MPICH 是手工拷貝的,等等)。
有一點(diǎn)非常清楚,上面的集群非常難以維護(hù)?,F(xiàn)在并不能方便地將文件拷貝到每個(gè)節(jié)點(diǎn)上、在每個(gè)要添加的節(jié)點(diǎn)上設(shè)置 SSH 和 MPI 以及在將節(jié)點(diǎn)移出集群時(shí)進(jìn)行適當(dāng)?shù)男薷?,等等? 幸運(yùn)的是,有一些優(yōu)秀的開放源碼軟件資源可以幫助我們?cè)O(shè)置和管理健壯的產(chǎn)品集群。OSCAR 和 Rocks 就是兩個(gè)這樣的軟件。我們?cè)趧?chuàng)建集群時(shí)所執(zhí)行的大部分操作都可以使用這些程序自動(dòng)實(shí)現(xiàn)。 圖 1 是一個(gè)簡(jiǎn)單集群的示意圖。 圖 1. 一個(gè)簡(jiǎn)單的示例集群 ![]() OSCAR 還可以支持使用 PXE(Portable Execution Environment)來自動(dòng)安裝 Linux。OSCAR 還可以幫助我們實(shí)現(xiàn)以下功能:
現(xiàn)在 OSCAR 可以支持多個(gè)版本的 Red Hat Linux;有關(guān)其他可以支持的發(fā)行版本,請(qǐng)參閱 OSCAR 的 Web 站點(diǎn)(請(qǐng)參閱 參考資料 中的鏈接)。根據(jù)在設(shè)置時(shí)所碰到的錯(cuò)誤,可能需要對(duì)幾個(gè)腳本進(jìn)行修改。
讓我們使用 OSCAR 資源來構(gòu)建一個(gè)功能完備的集群。假設(shè)有兩個(gè)或多個(gè)普通的工作站,它們都使用網(wǎng)絡(luò)連接在一起。將其中的一個(gè)節(jié)點(diǎn)設(shè)置為頭節(jié)點(diǎn),其他節(jié)點(diǎn)都設(shè)置為計(jì)算節(jié)點(diǎn)。 正如在構(gòu)建 Linux 集群時(shí)所做的一樣,我們要詳細(xì)介紹在頭節(jié)點(diǎn)上所執(zhí)行的步驟。OSCAR 可以自動(dòng)配置其他節(jié)點(diǎn),包括 OS 的安裝。(請(qǐng)參閱 OSCAR 安裝指南;下面是對(duì)安裝過程的概念性介紹。) 在頭節(jié)點(diǎn)上安裝 Linux。確保安裝 X 服務(wù)器。
確保已經(jīng)安裝并配置了 MySQL,并且可以從 Perl 中訪問 MySQL,因?yàn)?OSCAR 將所有的配置信息都保存到了 MySQL 中,并使用 Perl 來訪問這些信息。這個(gè)步驟通常是可選的,并且 OSCAR 也可以為我們執(zhí)行這些步驟,但是有時(shí)這個(gè)步驟會(huì)失敗,尤其是在一個(gè)尚不支持的發(fā)行版本上安裝時(shí)更是如此。 下載 OSCAR 源代碼并編譯它:
啟動(dòng) OSCAR 向?qū)?。假設(shè)我們想要這個(gè)集群使用 eth1 來連接集群中的節(jié)點(diǎn),請(qǐng)使用 在這個(gè)步驟中,一步步地通過所有的 OSCAR 設(shè)置屏幕。確保以正確的順序執(zhí)行以下步驟:
最后,運(yùn)行測(cè)試。如果一切運(yùn)行良好,每個(gè)測(cè)試都應(yīng)該成功。即使沒有任何問題,有時(shí)第一次嘗試運(yùn)行時(shí)也會(huì)有些測(cè)試失敗。還可以通過執(zhí)行 /opt/oscar 下面的測(cè)試腳本來手工執(zhí)行這些測(cè)試。 如果我們現(xiàn)在希望添加新的節(jié)點(diǎn),可以再次啟動(dòng) OSCAR 向?qū)Р⑻砑庸?jié)點(diǎn)。OSCAR 會(huì)使用 PXE 自動(dòng)將 Linux OS 安裝到這些節(jié)點(diǎn)上。 現(xiàn)在我們已經(jīng)準(zhǔn)備好集群環(huán)境了,接下來可以運(yùn)行并行程序了,并且可以根據(jù)需要添加或刪除新節(jié)點(diǎn),并使用 Ganglia 來監(jiān)視節(jié)點(diǎn)的狀態(tài)。
當(dāng)我們需要在一個(gè)具有大量用戶的產(chǎn)品環(huán)境中對(duì)集群進(jìn)行管理時(shí),作業(yè)調(diào)度和監(jiān)視就變得尤其重要了。 MPI 可以在各個(gè)節(jié)點(diǎn)上啟動(dòng)并停止進(jìn)程,但是這只能限定于同一個(gè)程序。在一個(gè)典型的集群上,會(huì)有很多用戶都要運(yùn)行自己的程序,我們必須使用調(diào)度軟件來確保它們可以最優(yōu)地使用集群。 一個(gè)流行的調(diào)度系統(tǒng)是 OpenPBS,可以使用 OSCAR 自動(dòng)安裝它。使用這個(gè)調(diào)度系統(tǒng),可以在集群上創(chuàng)建作業(yè),并將作業(yè)提交到集群上運(yùn)行。在 OpenPBS 中,還可以創(chuàng)建復(fù)雜的作業(yè)調(diào)度策略。 使用 OpenPBS 還可以查看正在執(zhí)行的作業(yè)、提交作業(yè)以及取消作業(yè)。它還可以控制某個(gè)作業(yè)可以使用的 CPU 時(shí)間的最大值,這對(duì)于系統(tǒng)管理員來說非常有用。 集群管理中的一個(gè)重要方面就是監(jiān)視,尤其是如果集群中有大量的節(jié)點(diǎn)就更是如此。此處有幾種選擇,例如 Ganglia(OSCAR 可以提供)和 Clumon。 Ganglia 有一個(gè)基于 Web 的前端界面,可以提供有關(guān) CPU 和內(nèi)存使用情況的實(shí)時(shí)監(jiān)視信息;可以方便地對(duì)其進(jìn)行擴(kuò)展,使其只監(jiān)視有關(guān)某項(xiàng)內(nèi)容的信息。例如,使用一些簡(jiǎn)單的腳本,我們就可以讓 Ganglia 匯報(bào) CPU 的溫度、風(fēng)扇轉(zhuǎn)速等等。在接下來的幾節(jié)中,我們將編寫一些并行程序,并在這個(gè)集群上運(yùn)行這些并行程序。
并行編程有自己的一些并行算法,它們可以充分利用底層硬件的性能。接下來讓我們來了解一下這種算法的信息。讓我們假設(shè)一個(gè)節(jié)點(diǎn)要對(duì)一組 N 個(gè)整數(shù)進(jìn)行求和運(yùn)算。用普通方法實(shí)現(xiàn)這種操作所需要的時(shí)間是 O(N)(如果對(duì) 100 個(gè)整數(shù)進(jìn)行求和需要 1ms,那么對(duì) 200 個(gè)整數(shù)進(jìn)行求和就需要 2ms,依此類推)。 這個(gè)問題看起來很難線性地提高其速度,但是值得注意的是,的確有這樣一種方法。讓我們來看一個(gè)在 4 個(gè)節(jié)點(diǎn)的集群上執(zhí)行程序的例子,每個(gè)節(jié)點(diǎn)的內(nèi)存中都有一個(gè)整數(shù),程序的目的是對(duì)這 4 個(gè)整數(shù)求和。 考慮下面的步驟:
正如我們可以看到的一樣,如果最初有 2N 個(gè)數(shù)字,這種方法在 ~N 個(gè)步驟中就可以實(shí)現(xiàn)求和運(yùn)算。因此算法的復(fù)雜度是 O(log2N),這相對(duì)于前面的 O(N) 來講是一個(gè)極大的改進(jìn)。(如果對(duì) 128 個(gè)數(shù)字進(jìn)行求和需要 1ms,那么使用這種方法對(duì) 256 個(gè)數(shù)字進(jìn)行求和就只需要 (8/7) ~ 1.2ms。在前面的方法中,這需要 2ms。)
這種方法在每個(gè)步驟中都可以釋放一半的計(jì)算節(jié)點(diǎn)。這種算法通常就稱為遞歸二分和倍增(recursive halving and doubling)法,它就是在 MPI 中 在并行編程中,有很多為實(shí)際問題所開發(fā)出的并行算法。
使用 MPI 進(jìn)行并行編程來實(shí)現(xiàn)矩陣與向量的乘法 現(xiàn)在我們已經(jīng)了解了并行編程平臺(tái)的基礎(chǔ)知識(shí),并且準(zhǔn)備好了一個(gè)集群,接下來就要編寫一個(gè)可以很好地利用這個(gè)集群的程序。我們并不編寫傳統(tǒng)的 “hello world”,而是直接跳到一個(gè)真實(shí)的例子上,并編寫基于 MPI 的程序來實(shí)現(xiàn)矩陣與向量的乘法。 我們將使用在 并行算法 一節(jié)中介紹的算法來很好地解決這個(gè)問題。假設(shè)有一個(gè) 4X4 的矩陣,我們希望將其與另外一個(gè) 4X1 的向量進(jìn)行乘法操作。我們將對(duì)矩陣乘法的標(biāo)準(zhǔn)技術(shù)稍微進(jìn)行一下修改,這樣就可以使用前面介紹的算法了。請(qǐng)參看圖 2 對(duì)于這種技術(shù)的闡述。 圖 2. 向量與矩陣的乘法 ![]() 我們并不對(duì)第一行與第一列進(jìn)行乘法操作,而是將第一列中的所有元素與向量中的第一個(gè)元素相乘,第二列的元素與向量中的第二個(gè)元素相乘,依此類推。采 用這種方法,就可以得到一個(gè)新的 4X4 矩陣。然后,將每一行中的所有 4 個(gè)元素相加,得到一個(gè) 4X1 的矩陣,這就是最后的結(jié)果。 MPI API 有多個(gè)函數(shù)可以直接解決這個(gè)問題,如清單 1 所示。 清單 1. 使用 MPI 執(zhí)行矩陣乘法
集群已經(jīng)構(gòu)建好,可以執(zhí)行程序了,接下來需要了解這些程序的執(zhí)行速度到底有多快。通常我們都認(rèn)為是處理器的頻率決定了性能的高低。對(duì)于特定的范圍來 說,這個(gè)結(jié)論是正確的;但是在不同供應(yīng)商的處理器或相同供應(yīng)商提供的不同處理器系列之間進(jìn)行比較,沒什么意義,因?yàn)椴煌奶幚砥髟诮o定的時(shí)鐘周期內(nèi)所執(zhí)行 的任務(wù)量是不同的。在 第 1 部分 中對(duì)向量和標(biāo)量處理器進(jìn)行比較時(shí),這尤其明顯。 對(duì)性能進(jìn)行比較的一種更加自然的方法是運(yùn)行標(biāo)準(zhǔn)測(cè)試。隨著時(shí)間的推移,有一個(gè)非常出名的 LINPACK 基準(zhǔn)測(cè)試已經(jīng)成為比較性能的標(biāo)準(zhǔn)。它是由 Jack Dongarra 在十年之前開發(fā)的,現(xiàn)在仍在由 top500.org 使用(請(qǐng)參閱 參考資料 中的鏈接)。 這個(gè)測(cè)試要解包含 N 個(gè)線性方程的密集方程組,其中浮點(diǎn)操作的個(gè)數(shù)是已知的(是 N^3 級(jí)別)。這個(gè)測(cè)試非常適合用來測(cè)試那些要運(yùn)行科學(xué)應(yīng)用程序和模擬的計(jì)算機(jī),因?yàn)樗鼈兌家谀承┎襟E上試圖對(duì)線性方程進(jìn)行求解。 測(cè)試的標(biāo)準(zhǔn)單位是每秒執(zhí)行的浮點(diǎn)操作數(shù)量,即 flop 數(shù)(在這種情況中,flop 或者是一個(gè) 64 位的加法操作,或者是一個(gè) 64 位的乘法操作)。這個(gè)測(cè)試要測(cè)量的內(nèi)容如下:
為了更好地理解這些數(shù)字,請(qǐng)考慮下面這個(gè)事實(shí):IBM BlueGene/L 在 1 秒之內(nèi)可以完成的操作在一臺(tái)家用計(jì)算機(jī)上需要執(zhí)行 5 天。 現(xiàn)在讓我們來討論一下如何對(duì) Linux 集群進(jìn)行基準(zhǔn)測(cè)試。除了 LINPACK 之外,其他基準(zhǔn)測(cè)試還有 HPC Challenge Benchmark 和 NAS benchmark。
對(duì) Linux 集群進(jìn)行基準(zhǔn)測(cè)試 要在 Linux 集群上運(yùn)行 LINPACK 基準(zhǔn)測(cè)試,我們需要獲得一個(gè)并行版本的 LINPACK,并對(duì)這個(gè)集群配置 LINPACK。我們將一步步地介紹整個(gè)過程。 警告:下面使用了普通的線性代數(shù)庫(kù);使用它只是作為一個(gè)參考。對(duì)于一個(gè)真正的測(cè)試來說,要使用已經(jīng)針對(duì)自己的環(huán)境優(yōu)化過的庫(kù)。 從 netlib.org 下載 hpl.tgz,這是 LINPACK 基準(zhǔn)測(cè)試的并行(MPI)版本(請(qǐng)參閱 參考資料 中的鏈接)。 從 netlib.org 下載 blas_linux.tgz,這是預(yù)先編譯好的 BLAS(Basic Linear Algebra Subprograms)。為了簡(jiǎn)單起見,可以使用一個(gè)為 Linux 準(zhǔn)備的預(yù)先編譯好的 BLAS 參考實(shí)現(xiàn),但是為了能夠得到更好的結(jié)果,應(yīng)該使用硬件供應(yīng)商所提供的 BLAS,或者使用開放源碼的 ATLAS 項(xiàng)目進(jìn)行自動(dòng)優(yōu)化。
解壓并展開 blas_linux.tgz,這樣應(yīng)該會(huì)得到一個(gè)名為 blas_linux.a 的文件。如果看到了這個(gè)文件,就可以忽略所看到的錯(cuò)誤。 解壓并展開 hpl.tgz,這樣應(yīng)該會(huì)得到一個(gè)目錄 hpl。 將所有的配置文件(例如 Make.Linux_PII_FBLAS)從 hpl/setup 拷貝到 hpl 目錄中,并將 hpl 中的拷貝重命名為 Make.LinuxGeneric。 編輯文件 Make.LinuxGeneric 中下面的內(nèi)容,并修改為適合您的環(huán)境的值:
TOPdir = /home/linpack/hpl
這 5 個(gè)地方指明了步驟 1 中 LINPACK 的頂級(jí)目錄、MPICH 安裝的頂級(jí)目錄以及步驟 2 中 BLAS 參考實(shí)現(xiàn)的位置。 現(xiàn)在編譯 HPL:
如果沒有錯(cuò)誤,就會(huì)得到兩個(gè)文件 xhpl 和 HPL.dat,它們都在 /home/linpack/hpl/bin/LinuxGeneric 目錄中。 在集群上運(yùn)行 LINPACK 基準(zhǔn)測(cè)試之前,將整個(gè) /home/linpack 目錄拷貝到集群中的所有機(jī)器上。(如果使用 OSCAR 創(chuàng)建的集群并配置了 NFS 共享,就可以忽略這個(gè)步驟。)
現(xiàn)在 注:上面的步驟會(huì)基于矩陣大小的缺省設(shè)置來運(yùn)行一些標(biāo)準(zhǔn)測(cè)試。使用文件 HPL.dat 來對(duì)測(cè)試進(jìn)行調(diào)優(yōu)。有關(guān)調(diào)優(yōu)的詳細(xì)信息可以在文件 /home/linpack/hpl/TUNING 中找到。
現(xiàn)在我們已經(jīng)構(gòu)建好了集群,接下來快速介紹一下 Blue Gene/L,這是一臺(tái)基于集群的非常好的超級(jí)計(jì)算機(jī)。Blue Gene/L 是一項(xiàng)大型的工程壯舉,對(duì)其進(jìn)行詳細(xì)介紹顯然已經(jīng)超出了本文的范圍?,F(xiàn)在我們只是簡(jiǎn)單介紹一下表面的東西。 三年前,地球模擬器(Earth Simulator)(向量處理器)成為世界上最快的計(jì)算機(jī),很多人都預(yù)測(cè)集群作為一種超級(jí)計(jì)算機(jī)平臺(tái)已經(jīng)走向了死亡,向量處理器已經(jīng)復(fù)蘇了;這個(gè)結(jié)論下得太早了。Blue Gene/L 在標(biāo)準(zhǔn)的 LINPACK 基準(zhǔn)測(cè)試中已經(jīng)徹底擊敗了地球模擬器。 Blue Gene/L 并不是使用常用的工作站來構(gòu)建的,但是它依然使用本系列文章中所討論的標(biāo)準(zhǔn)集群技術(shù)。它使用了一個(gè)源自于本文中使用的 MPICH 的 MPI 實(shí)現(xiàn)。它還可以運(yùn)行 700MHz 的標(biāo)準(zhǔn) 32 位 PowerPC® CPU(不過這些是基于片上系統(tǒng)或 SoC 技術(shù)的),這比該系列中的其他機(jī)器更能極大地降低對(duì)制冷和電源的需求。 Blue Gene/L 是一個(gè)非常大的機(jī)器,有 65,536 個(gè)計(jì)算節(jié)點(diǎn)(每個(gè)節(jié)點(diǎn)都運(yùn)行一個(gè)定制的操作系統(tǒng)),還有 1,024 個(gè)專用的 I/O 節(jié)點(diǎn)(運(yùn)行 Linux 內(nèi)核)。使用如此多的節(jié)點(diǎn),網(wǎng)絡(luò)就尤其重要了,Blue Gene/L 可以使用 5 種不同類型的網(wǎng)絡(luò),每種網(wǎng)絡(luò)都為一個(gè)特定的目的進(jìn)行了優(yōu)化。 有關(guān) Blue Gene/L 的更多信息可以在最近一期專門介紹它的 IBM Systems Journal 中找到。在 Blue Gene/L 中,我們看到了一個(gè)高度可擴(kuò)展的 MPP 實(shí)現(xiàn),以及基于集群的計(jì)算系統(tǒng)仍然會(huì)存在的清晰證據(jù)。 |
|