# GPU 基礎了解


## GPU 歷史

請先去看影片 [GPU 是怎麼被發明的?](https://youtu.be/Zb3m-8_sf8Q?si=tfwT0PmbjNRflmUS)。

隨者 1960/1970 圖形化應用程式的日益成長使用，第一個最早 2D 圖形控制器晶片出現

1. uPD7220 在 1981 由日本電氣公司發明，目的為了有效支援漢字
2. IBM 在 1981 也推出有擴充槽的電腦 IBM 5150，可以讓使用者自己安裝獨立的顯示卡
3. IBM 8514 1987 年推出，支援 1024 x 768 顯示分辨率的顯示卡
4. 1991 S3 推出 86C911 2D 圖形顯示卡

3D 圖形控制器也在學校盛行

1. 1981 Geometry Engine 在史丹佛大學
2. 1987 Matrox SM640 第一個 3D GPU
3. 1989 Sun 推出 GX Graphic 顯示卡，之後這個顯示卡的三個作者創建了 Nvidia - [他設計了第一個GPU、與黃仁勳一起創立了NVIDIA，不過在2006年就把手中的NVIDIA股票全賣光了](https://www.techbang.com/posts/116221-he-designed-the-first-gpu-for-the-pc-and-co-founded-nvidia)
4. 1993 SGI Reality Engine 推出專門硬體 for 3D

但上面都是 3D/2D 混合的 GPU，3dfs 在 1996 推出 Voodoo 3D 純加速晶片，遊戲玩家很愛，但就導致還要買 2D，麻煩。

之後 NV 因為支援 DirectX 協定，他的 GPU 變得熱門，到最後只剩下 NV and ATI 兩家廠商在打 GPU 市場，這兩家也是把顯示卡市場吃掉，直到最後 ATI 被 AMD 收購，現在就是 AMD vs NV。

在 2006 年，NV 推出 CUDA 讓 GPU 平行處理可以用在通用運算上面，一些科學任務可以用 CUDA API 來使用 GPU 平行運算的能力，叫做 GPGPU，

* 早期 GPU（純 graphics），固定 pipeline
* Programmable GPU（shader 時代）：可寫小程式
* GPGPU 時代（CUDA 出現），CUDA / OpenCL / Vulkan compute，GPU 被當 parallel processor

![alt text](image.png)

## GPU 本質

最早 3D 圖形工作，其實就是作

1. Transform: x y z 座標轉換成螢幕 2D 座標
2. Lighting: 法向量、光源、反射
3. Triangle Setup: 把三個 Vertext 弄成三角形
4. Rasterization: 三角形變成 Pixel
5. Frame Buffer

但可能有太多點要重複作這樣的計算，CPU 幾個核心不夠，因此 1999 Geforce 256 GPU 弄成一個固定功能硬體，就是做 Transform + Lighting，過去的 3D 控制器本質上只是個「輔助晶片（Controller/Accelerator）」，它像是一個聽話的工人，CPU 把幾何頂點數據算好、點連成線後丟給它，它才負責把顏色填上去（渲染）。 而 GeForce 256 內建了硬體 T&L 引擎，它能夠自行處理複雜的幾何數學運算。因為它展現了高度獨立的運算與處理能力，地位從「輔助控制器」晉升為與中央處理器（CPU）並駕齊驅的「處理單元（Processing Unit）」。

這時是 Fixed Funciton GPU，你只能調參數，像是光照模型等。

所以 GPU 就是專注於 Memory badnwidth，裡面沒有 Cache/分支預測，就是一堆算數單元 (ALU)。

之後出現 Vertex Shader，Shader 是在 GPU 上執行的一小段程式，你可以讓多個 Vertex 都套用同樣的程式，原本是為了讓我們決定顏色。

然後又發現 Pixel 也可以用 Shader，所以可以 Rasterization -> Pixel Shader -> Color

後來發現 Vertex and Pixel Shader 都是 Matrix Math，所以直接現在 Vertex Shader Unit and Pixel Shader Unit 都變成 Shader Core。

### GPU assembly

NVIDIA GPU，CUDA kernel 最終會被編譯成 GPU machine code。

* SASS（native GPU assembly）
* PTX（virtual ISA）

PTX 的存在有一個關鍵目的，把 GPU architecture 隔離開來，類似 byte code。

## 影片心得

看 [【硬核科普】从零开始认识显卡](https://youtu.be/vtR7cgYATdk?si=u5qLPqhoV-1yvOXV) 的心得：

圖像就是點，組成一堆三角面，然後經過貼圖、光照、著色，3D 轉成 2D（根據攝影機），最後變成我們看到的圖像。

顯卡分成透過 pin 腳供電或者透過背板供電，但要特定主板才能使用。

一個顯卡散熱模組佔了顯卡 90%，主要由熱管、均熱板、鰼片。

主要顯卡電路板上面由：

1. 影片輸出介面
2. PCIe 接口
3. 各種 PWM 電源相關的元件，用來管理電源。
4. GPU 記憶體
5. 中心 GPU
   1. Streaming Multiprocessor，簡稱 SM，每個 SM 是「小型 CPU cluster」，裡面包含
      1. CUDA cores（ALU），一個 SM 裡面會有多個 CUDA Core
      2. warp scheduler（排程）
      3. register file（暫存器）
      4. shared memory（共享記憶體）
      5. L1 cache / texture cache（通常跟 shared memory 共享 SRAM）
   2. L2 Cache
   3. NVDEC 編碼器，固定功能硬體
   4. PCIe 控制器
   5. 記憶體控制器，控制像是 GDDR/HBM 等專屬於 GPU 的記憶體

每個 CUDA Core 可以在每個週期執行多少次 Float 運算，可以得出浮點數算力。

![alt text](image-1.png)

除了 CUDA Core 還會有 Tensor Core，專門作矩陣乘法，除了用在 AI 還會用到 DLSS 在遊戲中插增。

## Reference

* [淺談GPU到底是什麼（中）：兼具SIMD與MIMD優點的SIMT](https://www.cool3c.com/article/133370)
* [GPU Architecture and Programming: From GPGPU to CUDA](https://www.csie.ntu.edu.tw/~cyy/courses/assembly/08fall/assignments/final/reports/gpgpu.pdf)

