并行計算與計算機架構
- 并行計算與計算機架構
-
- Big Picture
- 并行計算
- 并行性
- 計算機架構
-
- Flynn’s Taxonomy
- 根據記憶體劃分
- 總結
Abstract: 本文從總體上給出了CUDA程式設計的Big picture,後續所有的文章都在本文的基礎上詳細展開。
Keywords: 并行計算,串行程式設計,并行程式設計,計算機架構,并行性,異構架構,CUDA
并行計算與計算機架構
Big Picture
學習CUDA主要參考《CUDA C程式設計權威指南》。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL4NGRPNzZq1keNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL0ATNkhTMwQjNlJjYlZzYhZTZhRDZ3M2NjZDN1kTZjF2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
結構:
CUDA想要運作起來并不困難,但是想要寫得好,真的需要研究一下,某乎上各路大牛給出的建議是看CUDA的官方文檔,但是文檔教會你更多的是如何寫代碼,而沒有講解詳細的硬體結構,我們學習程式設計應該同時了解語言,程式設計模型,硬體執行模型,以及優化方法,單純的學會寫代碼,能運作,這是教育訓練班的節奏。
還記得峰哥的話,知道編譯原理和作業系統(軟硬體),什麼語言都一樣。
讀這個系列的文章需要以下知識:
- C/C++ 程式設計經驗
- 本系列是Freshman,後面會有Junior,主要内容肯定有所不同,目前準備的是Freshman主要介紹基礎知識,包括硬體基礎,程式設計模型,基本性能方面的考察,和簡單的優化(包括記憶體等),以及項目實際中的一些技巧;Junior部分主要介紹更進階的性能優化技巧,比如PTX,更進階的記憶體處理等;優化空間最大的是并行算法的設計,當然不在本系列所讨論的範圍内,那是另一個專題了。
并行計算
我們的計算機從最早的埃尼阿克到現在的各種超算,都是為了應用而産生的,軟體和硬體互相刺激而互相進步,并行計算也是這樣産生的,我們最早的計算機肯定不是并行的,但是可以做成多線程的,因為當時一個CPU隻有一個核,是以不可能一個核同時執行兩個計算,後來我們的應用逐漸要求計算量越來越高,是以單核的計算速度也在逐漸上升,後來大規模并行應用産生了,我們迫切的需要能夠同時處理很多資料的機器,比如圖像處理,以及處理大規模的同時通路的伺服器背景。
并行計算其實設計到兩個不同的技術領域:
- 計算機架構(硬體)
- 并行程式設計(軟體)
這兩個很好了解,一個生産工具,一個用工具産生各種不同應用。
硬體主要的目标就是為軟體提供更快的計算速度,更低的性能功耗比,硬體結構上支援更快的并行。
軟體的主要目的是使用目前的硬體壓榨出最高的性能,給應用提供更穩定快速的計算結果。
我們傳統的計算機結構一般是哈佛體系結構(後來演變出馮·諾依曼結構)主要分成三部分:
- 記憶體(指令記憶體,資料記憶體)
- 中央處理單元(控制單元和算數邏輯單元)
- 輸入、輸出接口
【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結 後面的馮諾依曼結構就把資料和指令都當做資料來處理了,這裡就不再介紹了,再次安利《深入了解計算機系統》這本書,裡面可以找到相關知識。
寫并行和串行的最大差別就是,寫串行程式可能不需要學習不同的硬體平台,但是寫并行程式就需要對硬體有一定的了解了。
并行性
寫并行程式主要是分解任務,我們一般把一個程式看成是指令和資料的組合,當然并行也可以分為這兩種:
- 指令并行
- 資料并行
我們的任務更加關注資料并行,是以我們的主要任務是分析資料的相關性,哪些可以并行,哪些不能不行。
如果你對并行不太了解,可以先去學習學習pThread和OpenMP,了解下載下傳多核CPU上是怎麼并行的,比如把用openmp把for并行。
任務并行多出現在各種管理系統,比如我們天天用的支付系統,基本上每時每刻都有很多人在同時使用,這時候就需要背景的處理能夠并行執行這些請求,不然全國人民排隊,那就比春運還熱鬧了。
我們研究的是大規模資料計算,計算過程比較單一(不同的資料基本用相同的計算過程)但是資料非常多,是以我們主要是資料并行,分析好資料的相關性,決定了我們的程式設計。
CUDA非常适合資料并行
資料并行程式設計,第一步就是把資料依據線程進行劃分
- 塊劃分,把一整塊資料切成小塊,每個小塊随機的劃分給一個線程,每個塊的執行順序随機(關于線程的概念可以去看《深入了解計算機系統》)
【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結
計算機架構
Flynn’s Taxonomy
劃分不同計算機結構的方法有很多,廣泛使用的一種被稱為佛林分類法Flynn’s Taxonomy,他根據指令和資料進入CPU的方式分類,分為以下四類:
分别以資料和指令進行分析:
- 單指令單資料SISD(傳統串行計算機,386)
- 單指令多資料SIMD(并行架構,比如向量機,所有核心指令唯一,但是資料不同,現在CPU基本都有這類的向量指令)
- 多指令單資料MISD(少見,多個指令圍毆一個資料)
- 多指令多資料MIMD(并行架構,多核心,多指令,異步處理多個資料流,進而實作空間上的并行,MIMD多數情況下包含SIMD,就是MIMD有很多計算核,計算核支援SIMD)
為了提高并行的計算能力,我們要從架構上實作下面這些性能提升:
- 降低延遲
- 提高帶寬
- 提高吞吐量
延遲是指操作從開始到結束所需要的時間,一般用微秒計算,延遲越低越好。
帶寬是機關時間内處理的資料量,一般用MB/s或者GB/s表示。
吞吐量是機關時間内成功處理的運算數量,一般用gflops來表示(十億次浮點計算),吞吐量和延遲有一定關系,都是反應計算速度的,一個是時間除以運算次數,得到的是機關次數用的時間–延遲,一個是運算次數除以時間,得到的是機關時間執行次數–吞吐量。
根據記憶體劃分
計算機架構也可以根據記憶體進行劃分:
- 分布式記憶體的多節點系統
-
共享記憶體的多處理器系統
第一個更大,通常叫做叢集,就是一個機房好多機箱,每個機箱都有記憶體處理器電源等一些列硬體,通過網絡互動,這樣組成的就是分布式。
第二個是單個主機闆有多個處理器,他們共享相同的主機闆上的記憶體,記憶體尋址空間相同,通過PCIe和記憶體互動。【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結 【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結 多個處理器可以分多片處理器,和單片多核(衆核many-core),也就是有些主機闆上挂了好多片處理器,也有的是一個主機闆上就一個處理器,但是這個處理器裡面有幾百個核。
GPU就屬于衆核系統。當然現在CPU也都是多核的了,但是他們還是有很大差別的:
- CPU适合執行複雜的邏輯,比如多分支,其核心比較重(複雜)
- GPU适合執行簡單的邏輯,大量的資料計算,其吞吐量更高,但是核心比較輕(結構簡單)
總結
本文主要介紹了下計算機架構的劃分和并行計算的基礎簡單介紹,後面我們繼續介紹異構和CUDA