幾種高性能計算平臺介紹

**MPI和openMPI的區別,或者CUDA和OpenCL的區別,這篇文章就是爲了總結下高性能計算的相關知識。目前高性能計算有兩大趨勢,並行計算集羣和CPU處理器GPU顯卡的異構混合計算。下面做對這些名詞進行一個簡單的介紹: 
MPI-Message Passing Interface是一個並行計算的API,適合超級電腦,大規模集羣。 
OpenMPI是一種高性能消息傳遞庫,可以很方便的把串行程序,改爲多線程並行程序,適合多核心電腦,可以和MPI搭配使用,對C語言和Fortran高性能計算支持很好。 
TBB-Intel Threading Building Blocks 線程構建模塊,是Intel公司開發的並行編程開發的工具,能很好的支持C++並行計算編程。 
CUDA(Compute Unified Device Architecture),顯卡廠商NVidia推出的運算平臺,使用顯卡和處理器進行異構並行計算,是比較高級的並行開發工具,不需要太多硬件知識。 
OpenCL (Open Computing Language) 是一個爲異構平臺編寫程序的框架,屬於API,和OpenGL架構類似,此異構平臺可由CPU,GPU或其他類型的處理器組成。

最近花了點時間,對OpenMP,OpenCL,MPI(有多種實現,如Open MPI)等,關於高性能計算的技術,做了一下簡單的瀏覽,我把這次簡單瀏覽所學習到的一點東西記錄在此。這些總結和記錄都比較半吊子,還需要更深入的學習和研究。 
首先,時下越來越熱的GPU計算,隨着中國天津的大型計算機拿到國際頭把運算力交椅,不得不讓人重視。現有的技術,從陣營上分,有NVidia的CUDA,AMD(ATI)的stream。還有一個開放標準:OpenCL。我是比較看好OpenCL的,因爲他可以支持同時對不同品牌,不同核心CPU和GPU的優化和加速,特別適合異構環境。他的基本原理就是系統裏邊內置一個類似編譯器,好像llvm,API的東西,軟件寫完的代碼只有到最後的硬件執行的時候進行最終編譯,這個編譯過程似乎是通過系統裏邊的硬件驅動Driver,現在都還需要另外安裝,intel,nvidia,amd提供的sdk中都分別包含有自己Driver,得以執行。所以OpenCL的程序主線程,會根據系統中是幾個核的多核CPU,那種架構的CPU(arm或者x86),有沒有GPU,哪種GPU? 來決定最後生成的工作線程的代碼傳遞給哪個Driver編譯執行。系統會自動保存編譯後的二進制代碼以備後用。這個過程看起來好像是一個動態語言的過程,但是實際上現在OpenCL還主要是底層的,經過擴展的c語言來寫。不同硬件的Driver充當了runtime的角色。 
intel,nvidia,amd等多家硬件廠商支持OpenCL,但是同時也有自己的小九九,比如nvidia的cuda,就提供了針對自己的更多的功能,而且函數上據說也更爲高級。所以說,如果是專門針對特定硬件環境下,比如開發大運算量的科學程序的話,最好使用專門硬件自己的GPU加速sdk開發。只有在要求通用性,比如商業軟件上,才使用OpenCL開發。 
另外,一貫討厭開放標準的微軟這次又和當年對待OpenGL一樣,用他的DirectorX來玩個性了。反正我是能不鳥他,就不鳥他!

其次,OpenMP和MPI,這兩個都是已經被廣泛使用的並行程序開發庫。他們的區別是:OpenMP是針對多核處理器,使用的是共享內存的並行方式,可以說更爲線程一些;MPI是針對服務器中,多個對稱並行CPU或者集羣服務器的情況,內容共享方式是混合的,更爲進程一些。 
從某種角度上說,OpenCL有代替OpenMP的可能和趨勢,裏邊會包含針對多核心CPU的處理。現在的環境下,還是OpenMP更合適——可以直接發揮多核心處理器的能力,而且不需要圖形開發的知識。這裏是一篇關於OpenMP和OpenCL性能的測試。 
現在的並行開發,主要就是MPI+OpenMP,前者負責將運算通過進程分佈到不同服務器的不同CPU上去,後者負責通過多線程,有效利用CPU中每個核心的效能。

再次,有文章顯示,爲了最好的發揮線程的效能,在同樣算法條件下,最好程序使用的線程和cpu提供的最大線程數一致,而且最好能夠綁定程序執行線程和CPU核心。GPU對某些計算加速效果特別好,效率也不錯,但是由於必須通過PCI用CPU進行調度,所以,實際程序設計的時候,要考慮這個通信過程的延時。

最後,現有的幾種並行計算技術: 
1、系統層面,使用進程遷移技術,從而讓所有支持多進程的程序,實現並行,如openmosix,這需要經過patch過的操作系統; 
2、硬件層面,也就是OpenCL等GPU加速技術,需要相應的硬件支持; 
3、開發語言方面,現在erlang這種動態語言,就提供了對集羣環境的支持,他會自動向加入集羣的服務器分佈運算進程。google Go語言可能也是類似的。

PS: 開發方面,OpenCL現在用起來門檻還是很高的,不知道以後會不會提供更高層的抽象庫。不過,我發現QT,現在可以支持OpenCL了,QTOpenCL雖然還沒有放入主枝,需要自己編譯開發包,但是文檔上說,提供了QT模式的函數。QT在被諾基亞收購之後,改變授權爲lgpl,加上技術越來越全面,的確成了一個跨平臺開發很好的解決方案了。真眼饞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章