天天看點

【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結

并行計算與計算機架構

  • 并行計算與計算機架構
    • Big Picture
    • 并行計算
    • 并行性
  • 計算機架構
    • Flynn’s Taxonomy
    • 根據記憶體劃分
  • 總結

Abstract: 本文從總體上給出了CUDA程式設計的Big picture,後續所有的文章都在本文的基礎上詳細展開。

Keywords: 并行計算,串行程式設計,并行程式設計,計算機架構,并行性,異構架構,CUDA

并行計算與計算機架構

Big Picture

學習CUDA主要參考《CUDA C程式設計權威指南》。

【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結

結構:

【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結

CUDA想要運作起來并不困難,但是想要寫得好,真的需要研究一下,某乎上各路大牛給出的建議是看CUDA的官方文檔,但是文檔教會你更多的是如何寫代碼,而沒有講解詳細的硬體結構,我們學習程式設計應該同時了解語言,程式設計模型,硬體執行模型,以及優化方法,單純的學會寫代碼,能運作,這是教育訓練班的節奏。

還記得峰哥的話,知道編譯原理和作業系統(軟硬體),什麼語言都一樣。

讀這個系列的文章需要以下知識:

  1. C/C++ 程式設計經驗
  2. 本系列是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的方式分類,分為以下四類:

【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結

分别以資料和指令進行分析:

  • 單指令單資料SISD(傳統串行計算機,386)
  • 單指令多資料SIMD(并行架構,比如向量機,所有核心指令唯一,但是資料不同,現在CPU基本都有這類的向量指令)
  • 多指令單資料MISD(少見,多個指令圍毆一個資料)
  • 多指令多資料MIMD(并行架構,多核心,多指令,異步處理多個資料流,進而實作空間上的并行,MIMD多數情況下包含SIMD,就是MIMD有很多計算核,計算核支援SIMD)

為了提高并行的計算能力,我們要從架構上實作下面這些性能提升:

  • 降低延遲
  • 提高帶寬
  • 提高吞吐量

延遲是指操作從開始到結束所需要的時間,一般用微秒計算,延遲越低越好。

帶寬是機關時間内處理的資料量,一般用MB/s或者GB/s表示。

吞吐量是機關時間内成功處理的運算數量,一般用gflops來表示(十億次浮點計算),吞吐量和延遲有一定關系,都是反應計算速度的,一個是時間除以運算次數,得到的是機關次數用的時間–延遲,一個是運算次數除以時間,得到的是機關時間執行次數–吞吐量。

根據記憶體劃分

計算機架構也可以根據記憶體進行劃分:

  • 分布式記憶體的多節點系統
  • 共享記憶體的多處理器系統

    第一個更大,通常叫做叢集,就是一個機房好多機箱,每個機箱都有記憶體處理器電源等一些列硬體,通過網絡互動,這樣組成的就是分布式。

    【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結
    第二個是單個主機闆有多個處理器,他們共享相同的主機闆上的記憶體,記憶體尋址空間相同,通過PCIe和記憶體互動。
    【CUDA 基礎】1.0 并行計算與計算機架構并行計算與計算機架構計算機架構總結

    多個處理器可以分多片處理器,和單片多核(衆核many-core),也就是有些主機闆上挂了好多片處理器,也有的是一個主機闆上就一個處理器,但是這個處理器裡面有幾百個核。

    GPU就屬于衆核系統。當然現在CPU也都是多核的了,但是他們還是有很大差別的:

  • CPU适合執行複雜的邏輯,比如多分支,其核心比較重(複雜)
  • GPU适合執行簡單的邏輯,大量的資料計算,其吞吐量更高,但是核心比較輕(結構簡單)

總結

本文主要介紹了下計算機架構的劃分和并行計算的基礎簡單介紹,後面我們繼續介紹異構和CUDA