關於高性能計算的知識記錄彙總-菜鳥級別

http://blog.csdn.net/feixiang_john/article/details/8088742

關於高性能計算的知識記錄彙總-菜鳥級別

菜鳥級別

 

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) 是一個爲異構平臺編寫程序的框架,此異構平臺可由CPU,GPU或其他類型的處理器組成

 

 

最近花了點時間,對openmpopencl,mpi(有多種實現,如open MPI)等,關於高性能計算的技術,做了一下簡單的瀏覽,我把這次簡單瀏覽所學習到的一點東西記錄在此。這些總結和記錄都比較半吊子,還需要更深入的學習和研究。

首先,時下越來越熱的gpu計算,隨着中國天津的大型計算機拿到國際頭把運算力交椅,不得不讓人重視。現有的技術,從陣營上分,有nvidia的cuda,AMD(ATI)的stream。還有一個開放標準:opencl

我是比較看好opencl的,因爲他可以支持同時對不同品牌,不同核心cpu和gpu的優化和加速,特別適合異構環境。他的基本原理就是系統裏邊內置一個類似編譯器,好像llvm的東西,軟件寫完的代碼只有到最後的硬件執行的時候進行最終編譯,這個編譯過程似乎是通過系統裏邊的硬件驅動driver(現在都還需要另外安裝,intelnvidiaamd提供的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,加上技術越來越全面,的確成了一個跨平臺開發很好的解決方案了。真眼饞。


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