計算機組成原理-特殊設備

計算機組成原理-顯卡(特殊設備)

  本文根據徐文浩老師的計算機組成原理記錄:計算機組成原理

  CSDN base64 圖片顯示有問題, 想要個人筆記的可以私我

1 圖形的渲染過程

  現在電腦裏面顯示出來的 3D 的畫面,其實是通過多邊形組合出來的。你在玩的各種遊戲,裏面的人物的臉,並不是那個相機或者攝像頭拍出來的,而是通過多邊形建模(Polygon Modeling)創建出來的。

  這個對於圖像進行實時渲染的過程,可以被分解成下面這樣 5 個步驟:

  1. 頂點處理(Vertex Processing)
  2. 圖元處理(Primitive Processing)
  3. 柵格化(Rasterization)
  4. 片段處理(Fragment Processing)
  5. 像素操作(Pixel Operations)

1.1 頂點處理

  圖形渲染的第一步是頂點處理。構成多邊形建模的每一個多邊形呢,都有多個頂點(Vertex)。這些頂點都有一個在三維空間裏的座標。但是屏幕是二維的,所以在確定當前視角的時候,需要把這些頂點在三維空間裏面的位置,轉化到屏幕這個二維空間裏面。這個轉換的操作,就被叫作頂點處理。這裏面每一個頂點位置的轉換,互相之間沒有依賴,是可以並行獨立計算的。

1.2 圖元處理

  圖元處理,其實就是要把頂點處理完成之後的各個頂點連起來,變成多邊形。其實轉化後的頂點,仍然是在一個三維空間裏,只是第三維的 Z 軸,是正對屏幕的“深度”。針對這些多邊形,需要做一個操作,叫剔除和裁剪(Cull and Clip),也就是把不在屏幕裏面,或者一部分不在屏幕裏面的內容給去掉,減少接下來流程的工作量。

1.3 柵格化

  屏幕分辨率是有限的。它一般是通過一個個“像素(Pixel)”來顯示出內容的。所以,要把圖形轉換成屏幕裏面的一個個像素點。這個操作就叫作柵格化。柵格化操作,有一個特點和頂點處理是一樣的,每一個圖元都可以並行獨立地柵格化。

1.4 片段處理

  片段處理, 就是計算每一個像素的顏色、透明度等信息,給像素點上色。這步操作,同樣也可以每個片段並行、獨立進行,和頂點處理和柵格化一樣。

1.5 像素操作

  把不同的多邊形的像素點“混合(Blending)”到一起。可能前面的多邊形可能是半透明的,那麼前後的顏色就要混合在一起變成一個新的顏色;或者前面的多邊形遮擋住了後面的多邊形,那麼只要顯示前面多邊形的顏色就好了。最終,輸出到顯示設備。

2 GPU 與深度學習

  圖形渲染的流程是固定的,直接用硬件來處理這部分過程,而且這樣的硬件會比製造有同樣計算性能的 CPU 要便宜得多。因爲整個計算流程是完全固定的,不需要流水線停頓、亂序執行等等的各類導致 CPU 計算變得複雜的問題。也不需要有什麼可編程能力,只要讓硬件按照寫好的邏輯進行運算就好了。

  現代 CPU 裏的晶體管變得越來越多,越來越複雜,其實已經不是用來實現“計算”這個核心功能,而是拿來實現處理亂序執行、進行分支預測,以及高速緩存。而在 GPU 裏,這些電路就顯得有點多餘了,GPU 的整個處理過程是一個流式處理(Stream Processing)的過程, GPU 的運算是天然並行的。因爲沒有那麼多分支條件,或者複雜的依賴關係,可以把 GPU 裏這些對應的電路都可以去掉,做一次小小的瘦身,只留下取指令、指令譯碼、ALU 以及執行這些計算需要的寄存器和緩存就好了。一般來說,把這些電路抽象成三個部分,就是取指令和指令譯碼、ALU 和執行上下文。

![GPU構造][GPU構造]

  GPU 借鑑了 CPU 裏面的 SIMD,用了一種叫作SIMT(Single Instruction,Multiple Threads)的技術。SIMT 比 SIMD 更加靈活。在 SIMD 裏面,CPU 一次性取出了固定長度的多個數據,放到寄存器裏面,用一個指令去執行。而 SIMT,可以把多條數據,交給不同的線程去處理。

  在通過芯片瘦身、SIMT 以及更多的執行上下文,我們就有了一個更擅長並行進行暴力運算的 GPU。這樣的芯片,也正適合今天的深度學習的使用場景。一方面,GPU 是一個可以進行“通用計算”的框架,我們可以通過編程,在 GPU 上實現不同的算法。另一方面,現在的深度學習計算,都是超大的向量和矩陣,海量的訓練樣本的計算。整個計算過程中,沒有複雜的邏輯和分支,非常適合 GPU 這樣並行、計算能力強的架構。

3 FPGA

  FPGA: 現場可編程門陣列(Field-Programmable Gate Array)。

  • P 代表 Programmable,這個很容易理解。也就是說這是一個可以通過編程來控制的硬件
  • G 代表 Gate 也很容易理解,它就代表芯片裏面的門電路。我們能夠去進行編程組合的就是這樣一個一個門電路
  • A 代表的 Array,叫作陣列,說的是在一塊 FPGA 上,密密麻麻列了大量 Gate 這樣的門電路
  • 最後一個 F,不太容易理解。它其實是說,一塊 FPGA 這樣的板子,可以在“現場”多次進行編程。它不像 PAL(Programmable Array Logic,可編程陣列邏輯)這樣更古老的硬件設備,只能“編程”一次,把預先寫好的程序一次性燒錄到硬件裏面,之後就不能再修改了

  用存儲和功能實現組合邏輯。在 FPGA 裏,這些基本的電路邏輯,不是採用佈線連接的方式進行的,而是預先根據我們在軟件裏面設計的邏輯電路,算出對應的真值表,然後直接存到一個叫作 LUT(Look-Up Table,查找表)的電路里面。

  對於需要實現的時序邏輯電路,我們可以在 FPGA 裏面直接放上 D 觸發器,作爲寄存器。這個和 CPU 裏的觸發器沒有什麼本質不同。把很多個 LUT 的電路和寄存器組合在一起,變成一個叫作邏輯簇(Logic Cluster)的東西。在 FPGA 裏,這樣組合了多個 LUT 和寄存器的設備,也被叫做 CLB(Configurable Logic Block,可配置邏輯塊)。

  FPGA 是通過可編程邏輯佈線,來連接各個不同的 CLB,最終實現想要的芯片功能。這個可編程邏輯佈線,可以把它當成鐵路網。整個鐵路系統已經鋪好了,但是整個鐵路網裏面,設計了很多個道岔。通過控制道岔,來確定不同的列車線路。在可編程邏輯佈線裏面,“編程”在做的,就是撥動像道岔一樣的各個電路開關,最終實現不同 CLB 之間的連接,完成芯片功能。於是,通過 LUT 和寄存器,能夠組合出很多 CLB,而通過連接不同的 CLB,最終有了芯片功能。最關鍵的是,這個組合過程是可以“編程”控制的。而且這個編程出來的軟件,還可以後續改寫,重新寫入到硬件裏。讓同一個硬件實現不同的芯片功能。從這個角度來說,FPGA 也是“軟件吞噬世界”的一個很好的例子。

4 ASIC

  除了 CPU、GPU,以及剛剛的 FPGA,生活中還需要用到很多其他芯片。比如,現在手機裏就有專門用在攝像頭裏的芯片;錄音筆裏會有專門處理音頻的芯片。儘管一個 CPU 能夠處理好手機拍照的功能,也能處理好錄音的功能,但直接在手機或者錄音筆裏塞上一個 Intel CPU,顯然比較浪費。於是,爲這些有專門用途的場景,單獨設計一個芯片。這些專門設計的芯片呢,我們稱之爲ASIC(Application-Specific Integrated Circuit),也就是專用集成電路。對 FPGA 進行“編程”,其實就是把 FPGA 的電路變成了一個 ASIC。

5 TPU

  深度學習熱起來之後,計算量最大的並不是進行深度學習的訓練,而是深度學習的推斷部分。

推斷部分,是指完成深度學習訓練之後,把訓練完成的模型存儲下來。這個存儲下來的模型,是許許多多個向量組成的參數。然後,根據這些參數,去計算輸入的數據,最終得到一個計算結果。這個推斷過程,可能是在互聯網廣告領域,去推測某一個用戶是否會點擊特定的廣告;也可能是經過高鐵站的時候,掃一下身份證進行一次人臉識別,判斷一下是不是本人。雖然訓練一個深度學習的模型需要花的時間不少,但是實際在推斷上花的時間要更多。

  模型的訓練和推斷的不同:

  1. 深度學習的推斷工作更簡單,對靈活性的要求也就更低
  2. 深度學習的推斷的性能,首先要保障響應時間的指標
  3. 深度學習的推斷工作,希望在功耗上儘可能少一些

5.1 TPU 的設計

  TPU 的設計滿足如下條件:

  1. 向前兼容, 就像一塊顯卡一樣,可以直接插在主板的 PCI-E 口上
  2. 沒有像現代 GPU 一樣,設計成自己有對應的取指令的電路,而是通過 CPU,向 TPU 發送需要執行的指令
  3. 專用電路和大量緩存,適應推斷的工作流程
  4. 對數據做歸一化(Normalization)和正則化(Regularization)的處理,使用 8 Bits 數據

![TPU設計][TPU設計]

  在芯片模塊圖裏面,有單獨的矩陣乘法單元(Matrix Multiply Unit)、累加器(Accumulators)模塊、激活函數(Activation)模塊和歸一化 / 池化(Normalization/Pool)模塊。而且,這些模塊是順序串聯在一起的。這是因爲,一個深度學習的推斷過程,是由很多層的計算組成的。而每一個層(Layer)的計算過程,就是先進行矩陣乘法,再進行累加,接着調用激活函數,最後進行歸一化和池化。這裏的硬件設計,就是把整個流程變成一套固定的硬件電路。這也是一個 ASIC 的典型設計思路,其實就是把確定的程序指令流程,變成固定的硬件電路。

芯片佈局圖

  芯片佈局圖,其中控制電路(Control)只佔了 2%。這是因爲,TPU 的計算過程基本上是一個固定的流程。不像 CPU 有各種複雜的控制功能,比如冒險、分支預測等等。超過一半的 TPU 的面積,都被用來作爲 Local Unified Buffer(本地統一緩衝區)(29%)和矩陣乘法單元(Matrix Mutliply Unit)。相比於矩陣乘法單元,累加器、實現激活函數和後續的歸一 / 池化功能的激活管線(Activation Pipeline)也用得不多。因爲,在深度學習推斷的過程中,矩陣乘法的計算量是最大的,計算也更復雜,所以比簡單的累加器和激活函數要佔用更多的晶體管。而統一緩衝區(Unified Buffer),則由 SRAM 這樣高速的存儲設備組成。SRAM 一般被直接拿來作爲 CPU 的寄存器或者高速緩存。我們在後面的存儲器部分會具體講。SRAM 比起內存使用的 DRAM 速度要快上很多,但是因爲電路密度小,所以佔用的空間要大很多。統一緩衝區之所以使用 SRAM,是因爲在整個的推斷過程中,它會高頻反覆地被矩陣乘法單元讀寫,來完成計算。

6 虛擬機

  虛擬機(Virtual Machine)技術,其實就是指在現有硬件的操作系統上,能夠模擬一個計算機系統的技術。而模擬一個計算機系統,最簡單的辦法,其實不能算是虛擬機技術,而是一個模擬器(Emulator)。

6.1 解釋型虛擬機

  要模擬一個計算機系統,最簡單的辦法,就是兼容這個計算機系統的指令集。可以開發一個應用程序,跑在我們的操作系統上。這個應用程序呢,可以識別我們想要模擬的、計算機系統的程序格式和指令,然後一條條去解釋執行。這種解釋執行方式的最大的優勢就是,模擬的系統可以跨硬件。

  比如,Android 手機用的 CPU 是 ARM 的,而我們的開發機用的是 Intel X86 的,兩邊的 CPU 指令集都不一樣,但是一樣可以正常運行。如果你想玩的街機遊戲,裏面的硬件早就已經停產了,那你自然只能選擇 MAME 這樣的模擬器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章