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

2021-06-10 08:13:28 字數 2772 閱讀 1083

菜鳥級別

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等 幾乎所有的應用,效能瓶頸永遠是在頻寬那裡,硬體方面這裡就不提了,說說我們能做的事。找了半天沒有找到那張圖,關於各...