高性能计算中并行的概念理解
高性能計算中并行的概念理解
分類:?并行計算高性能計算HPC — General2011-11-09 22:54?932人閱讀?評論(0)?收藏?舉報 編譯器編程parallel優化formsvector要理解并行編程,首先要從并行的理解開始。
(1)從Wiki中并行編程的解釋說起
Wiki是個好東西,包含了很多專業術語的解釋,關鍵的是,除了解釋,wiki還是一個好文檔。
Paralle Programming(并行編程/并行計算)Wiki:http://en.wikipedia.org/wiki/Parallel_programming
Parallel computing is a form of computation in which many calculations are carried out simultaneously,[1] operating on the principle that large problems can often be divided into smaller ones, which are then solved concurrently ("in parallel").?There are several different forms of parallel computing: bit-level, instruction level, data, and task parallelism. Parallelism has been employed for many years, mainly in high-performance computing.
這里要討論的就是上面的這句話中加粗的部分的內容。要理解好并行編程,首先需要理解并行編程的形式。并行編程的形式包括:
bit-level?parallelism:位級別的并行,是基于處理器的字長不斷增加的基礎上,就比較容易理解了。處理器的字長不斷增加,并行度自然增加。(http://en.wikipedia.org/wiki/Bit-level_parallelism)
instruction level parallelism(ILP):指令級并行,是指處理器能同時處理多條指令。
data level parallelism(DLP):數據集并行,是指處理器能同時處理多條數據。
task level parallelism(TLP):任務級并行,我見過更多的是稱為Thread-level parallelism(TLP),即線程級并行。
下面就這些并行的概念進行進一步分析,這些并行的方式,特別是BLP、ILP和DLP本身都是和處理器微架構有關的內容,從微架構的角度,才能更理解并行。線程級并行可以是軟件也可以有硬件支持。
(2)并行的兩大分類
既然提到了微架構,就不得提一下并行的兩大分類,微架構中經常將并行分為兩大類:時間并行和空間并行。時間并行指的是流水線并行,空間并行包括指令并行、數據并行和線程并行。
更多關于以微架構的角度討論這幾個并行,參考相關的書籍,入門推薦《大話處理器》。
(3)指令級并行
所謂指令級并行,是指處理器能同時運行多條指令。
一般而言,如果程序中相鄰的一組指令是相互獨立的,即不競爭同一個功能部件、不相互等待對方的運算結果、不訪問同一個存儲單元,那么它們就可以在處理器內部并行地執行。
超標量(Superscalar)技術 和 超長指令字(Very Long Instruction Word, VLIW)技術是目前最基本的兩類指令級并行技術。前者的特點是采用普通的指令,設置多條并行工作的指令流水線;后者的特點是:將若干條普通指令組裝在一起,形成一條“超級指令”。這條“超級指令”包含多個不同操作碼,這些操作碼分別處理不同的操作數。對應這些操作碼,一一對應地設置相應的功能部件。這樣,只要取指令一次、分析指令一次,VLIW 技術就可以實現對多個不同的操作數,同時進行不同的處理/計算。目前,主流的微處理器都采用了超標量技術。
當然,現代處理器有很多能幫助其進行指令并行的設計,比如亂序執行、寄存器重命名等技術。指令級命令,需要依賴于具體的硬件支持,以及編譯器支持。通常,我們需要依賴編譯器的優化來生成指令級并行的代碼,當然,對于有些情況,編譯器需要我們的幫助,更容易生成指令級并行的代碼,具體需要根據編譯器的實現。
參考http://www.docin.com/p-148703990.html介紹用軟件方法開發指令級并行代碼,其實,其分析的正是編譯器生成指令級并行的例子(流水線調度和循環展開等)。
(3)數據級并行
所謂數據級并行,是指處理器能同時運行多條數據。數據并行需要從SIMD、MMX、SSE等談起了。
SIMD:single instruction multiple data,單指令多數據,即同一操作會重復處理多個數據,一條語句處理多個數據的指令,就是SIMD指令。SIMD指令的出現是從多媒體時代開始的,由于多媒體中很多數據的處理就是SIMD的模型,所以,誕生了SIMD指令。現在的高性能處理器都支持SIMD指令,Intel從1996年開始增加MMX(MultiMedia eXtensions)指令集(也即SIMD指令),后來逐步增加了SSE(Streaming SIMD Extensions)、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AVX(Advanced Vector Extensions)指令集。所以說,數據級并行,也是依靠處理器的指令集完成了。數據并行的模型包括垂直計算形式、水平計算形式、標量計算模式,圖解可參考《大話處理器》的相關內容。
簡單的理解,向量a[N],b[N],c[N],那么
1. 垂直計算模式:a[i] op b[i] = c[i]
2. 水平計算模式:a[i] op a[i+1] = c[i] (前半部分)?b[i] op b[i+1] = c[i] (后邊部分),這里的前半部分后半部分并不是嚴格的,得看指令會如何處理,總是,垂直計算方式,操作數來自于不同的源,水平計算方式,操作數可以來自于同一個源。
3. 標量計算模式:a[0] op b[0] = c[0],其余不變。
對于多媒體的計算和科學計算,存在大量類似的計算,所以說SIMD能極大的提高計算性能。
當然,數據并行,比如垂直計算模式,最常見的情況,就是一個for循環了。
for(int i = 0;i< N;i ++) c[i] = a[i] + b[i];
這樣的代碼就能生成SIMD指令,那么是不是這么一個循環,直接一條指令搞定!當然不是,并行是有限制的,能接受的N不可能無限大!對于不同的指令集,一次數據并行能接受的數據長度是一定的,對于AVX指令集,能接受的長度為256字節。所以,可以對這樣的循環進行優化,比如:
for(int i = 0;i < N;i +=4) { c[i] = a[i] + b[i]; c[i+1] = a[i+1] + b[i+1]; c[i+2] = a[i+2] + b[i+2]; c[i+3] = a[i+3] + b[i+3]; }
這樣編譯器就能很容易的生成SIMD指令(具體需要依賴編譯器的實現,這里的4也是一個例子,前提是數組a/b/c的數據元素乘以4為SIMD指令集能接受一次運算的長度)
(4)線程級并行
線程并行是一種更高層的數據并行,是一種分時復用的思想。線程級并行可以依靠操作系統(軟件)來完成,但是現在的處理器,硬件也會為線程并行提供幫助,從而提高線程并行的效率。
更多內容,參考《大話處理器》或者其他關于微架構的資料。
只有了解和理解了并行的這些概念,才能更好的理解編譯器優化的工作,也就能更好的讓我們寫出更容易讓編譯器生成并行化代碼的代碼。
總結
以上是生活随笔為你收集整理的高性能计算中并行的概念理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实用遗传咨询 | 精神与行为异常-Aut
- 下一篇: 机器学习 | 距离计算