菜鳥級別
mpi和openmpi的區別,或者cuda和opencl的區別,這篇文章就是為了總結下高效能計算的相關知識。
目前高效能計算有兩大趨勢,平行計算集群和cpu處理器和gpu顯示卡的異構混合計算。
下面做對這些名詞進行乙個簡單的介紹:
mpi- (message passing inte***ce)是乙個平行計算的api,適合超級電腦,大規模集群。
openmpi是一種高效能訊息傳遞庫,可以很方便的把序列程式,改為多執行緒並行程式,適合多核心電腦,可以和mpi搭配使用,對c語言和fortran高效能計算支援很好。
tbb-intel threading building blocks 執行緒構建模組,是intel公司開發的並行程式設計開發的工具,能很好的支援c++平行計算程式設計。
cuda(compute unified device architecture),顯示卡廠商nvidia推出的運算平台,使用顯示卡和處理器進行異構平行計算。
opencl(open computing language) 是乙個為異構平台編寫程式的框架,此異構平台可由cpu,gpu或其他型別的處理器組成
最近花了點時間,對
openmp
,opencl
,mpi(有多種實現,如
open mpi
)等,關於高效能計算的技術,做了一下簡單的瀏覽,我把這次簡單瀏覽所學習到的一點東西記錄在此。這些總結和記錄都比較半吊子,還需要更深入的學習和研究。
首先,時下越來越熱的gpu計算,隨著中國天津的大型計算機拿到國際頭把運算力交椅,不得不讓人重視。現有的技術,從陣營上分,有nvidia的
cuda
,amd(ati)的
stream
。還有乙個開放標準:
opencl。
我是比較看好opencl的,因為他可以支援同時對不同品牌,不同核心cpu和gpu的優化和加速,特別適合異構環境。他的基本原理就是系統裡邊內建乙個類似編譯器,好像llvm的東西,軟體寫完的**只有到最後的硬體執行的時候進行最終編譯,這個編譯過程似乎是通過系統裡邊的硬體驅動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,加上技術越來越全面,的確成了乙個跨平台開發很好的解決方案了。真眼饞。
這個**
裡邊有opencl的新聞。
計算機基礎知識記錄 偏前端
一 網路知識 1 內網 在內網部署的應用,預設只能用內網位址在同乙個區域網內互連互通訪問,在外網其他網路環境下是訪問不到的。2 穿透 二點直連方式,如二台電腦網線直通,穿透是不限速的,速度是二端間的較小速度端的速度。3 對映 乙個位址對映到另乙個位址,通過某個介質進行中轉,常常用於將內網位址對映到外...
關於高效能的那點事
園子裡面很多關於高效能,大併發,還有什麼日pv 百萬的架構搭建。其實真心真心很扯淡。對於大部分應用來說,想要高效能,主要是要做到盡可能的減少網路請求 含db redis mongo mq 等 幾乎所有的應用,效能瓶頸永遠是在頻寬那裡,硬體方面這裡就不提了,說說我們能做的事。關於各個元件到cpu 的時...
關於高效能的那點事
園子裡面很多關於高效能,大併發,還有什麼日pv百萬的架構搭建。其實真心真心很扯淡。對於大部分應用來說,想要高效能,主要是要做到盡可能的減少網路請求 含db redis mongo mq等 幾乎所有的應用,效能瓶頸永遠是在頻寬那裡,硬體方面這裡就不提了,說說我們能做的事。找了半天沒有找到那張圖,關於各...