What is CUDA, the Compute Unified Device Architecture
在全球爆炒GeForce RTX 3000系顯示卡的同時,筆者也開始重新思考除了8K Gaming外讓N卡大放光彩的特性,一個讓英偉達即使受到Intel和AMD的分庭抗禮,卻仍然在多媒體生産,資料科學,大規模計算上仍然鶴立雞群的獨特技術。
筆者指的就是CUDA,它的全稱是:
Compute Unified Device Architecture
統一計算裝置架構
是英偉達研發的計算平台和程式設計模型,它利用并行計算原理在GPU上進行通用計算。
CUDA允許計算機在運作支援顯示卡加速的應用時,讓序列性(sequential)程式運作于更加擅長單線程運算的CPU,并讓偏重重度計算的部分并列運作在成百上千的GPU核心。是以用CUDA編寫的程式能充分利用 GPU 的力量以大幅提高計算性能(隻能在英偉達的GPU上運作)。
目前CUDA基于多種語言,支援C++,Fortran,Python和MATLAB等,實作起來也随着API的逐漸發展而日漸簡單。
筆者一年多前曾購買過英偉達的單片機Jetson Nano,作業系統有一個內建的CUDA ToolKit,用來寫一些簡單但實用的程式,樂趣無窮。Jetson Nano隻有192個流處理器(CUDA Core),但已經可以在機器學習,資料處理和一些基本操作上發揮出比較可觀的性能優勢。
筆者相信,這項技術,将在未來數年在相關領域發揮極其重要的作用。今天開始,筆者将從基礎技術開始,溫習一下這項技術的各個方面。
Speed is irrelevant if you are running the wrong direction, especially when you are alone.
下面先扯一些CPU的事情,下一章再說GPU,以及CPU和GPU計算的差别。
Parallelism
英特爾三劍客:安德魯·葛洛夫 Andrew Grove 羅伯特·諾伊斯 Robert Noyce 和 戈登·摩爾 Gordon Moore
戈登·摩爾有一句至理名言:
每過一年,半導體處理器核心的時鐘頻率都會翻番
這一定理般的話,一直持續到近些年。如今,處理器單核的時鐘頻率已經達到了飽和(是以你不太會找到一個單核頻率5GHz的處理器,即使是在不遠的将來),處理器的範式也逐漸演變為了多核心。
并行處理這一技術應運而生,登上曆史舞台。
正如計算機科學原理所說,在現代計算機中,一條指令總結起來需要大緻五步:
這就是基礎的五步RISC架構(five-stage RISC architecture)
用CPU實作并行處理有多種方法。首先,是指令級平行運算 ILP(Instruction Level Parallelism),也被稱為Pipelining
Pipelining
CPU管線
允許CPU在一個時鐘周期内可以同時運作的一系列指令
Before
一個不相容ILP的中央處理器會逐漸進行上述的五個步驟:
取指令 - 解碼指令 -> 執行指令 -> 通路記憶體 -> 寫回寄存器
是以,完成一條指令至少需要五個時鐘周期。不僅如此,同時晶片的其他部分都在等待該指令執行完畢。
非常低效
After
這就是CPU管線化(CPU Pipelining)所要解決的問題。應用Pipelining,在一個時鐘周期内,多個指令的多個程序在同時運作。這也照應了它在業内标準的名字:Instruction Level Parallelism 指令級平行運算
指令級平行運算 的基本流程
用管線化的指令,指令通量增加了,計算機也得以在一個時鐘周期内處理多個指令。但是因為ILP本身的性質,處理器的資源還是存在閑置。
在管線晶片中,指令通量增加了。之前,一個指令花五個時鐘周期才能完成。而之後,從第五周期開始,每個周期末尾都有一個指令執行完畢(假設每步指令占用一個循環)。
注意,在非管線的晶片被認為指令之間是互相獨立的,是以不會有資料危險。而在管線晶片中,資料危險是存在的。
比如:
在一個管線晶片中,I1(第一條指令,下同) 從 t1(第一時鐘周期,下同) 開始,到 t5 結束。I2從t2開始,到t6結束。整數1 在 t5(WB 階段)添加到 R5 中。第二個指令在第二步(時間 t3)讀取 R5 的價值。是以,它不會擷取更新後的值,這會帶來危險。I1 - ADD 1 to R5 I2 - COPY R5 to R6
現代編譯器會将進階語言解碼為低級語言,并處理如以上這種危險。
Superscalar
指令級平行運算 (ILP) 還可以通過實施超标量體系架構來實作。和管線處理器的主要差別是(超标量體系處理器也屬于管線處理器):
超标量體系架構使用同一晶片上的多個執行單元實作 ILP,而管線處理器(UE)則将執行單元分多個階段來實作。
這意味着,在超标量體系架構中,多個指令可以同時處于執行周期的同一階段。這是絕對不可能在一個簡單的管線晶片實作的。超标量微處理器可以同時執行兩個或兩個以上的指令,相對應的,他們通常至少有2個ALUs。
超标量處理器可以在同一時鐘周期中發送多個指令。這意味着多個指令可以在同一時鐘周期中開始。如果你看上面的管線架構,你會發現在一個時鐘周期中,管線處理器隻能發送一個指令。超标量體系架構的情況并非如此。但我們隻有一個指令計數器(在運作過程中,多個指令被跟蹤),這仍然隻是一個程序。
eg. Hyper-Threading 超線程
以英特爾i7-10700為例。處理器擁有 6 個獨立核心,每個核心都實作完整的 x86 ISA指令集。每個核心都帶有 2 個實體核心。
Hyperthreading是一種令人興奮的技術,也是英特爾的專有技術。作業系統使用該技術将單個核心視為兩個虛拟核心,以增加管道中的硬體指令數量(請注意,并非所有作業系統都支援 HT,英特爾建議在這種情況下禁用 HT)。綜上所述,上述英特爾 i7 共有 6 個實體核心和 12 個線程。
SMT (Simultaneous MultiThreading)
HyperThreading 隻是一種更好地利用處理器核心的技術。很多時候,處理器核心隻使用其資源的一小部分來執行指令。HT 所做的僅是,它用多個CPU寄存器 ,并在處于閑置的核心部分執行更多指令。是以,一個核心可以顯示為兩個邏輯核心,但應當認為它們并非完全獨立。如果兩個“核心”都需要通路 CPU 資源,則其中一個必須等待。
這就是為什麼我們不能用超線程單核 CPU 取代雙核 CPU 的原因。
雙核 CPU 将擁有真正獨立、不需要遵循一定秩序的核心,每個核心都有自己的資源。
另請注意,HT 是英特爾實作 SMT(同時多線程)。SPARC(一款有可擴充性功能的微處理器) 對 SMT 的實作方式不同,目标相同。
上圖中,
- 粉紅色的框表示單個 CPU 核心。
- RAM 包含 4 個不同程式,以不同的顔色表示。
- 白格子子代表管線停頓。
CPU 使用類似于超線程的技術實作 SMT。是以,它能夠同時運作兩個不同程式(紅色和黃色)。
是以,多核CPU是合理的存在。需要注意的是,CPU旨在固定順序程式。CPU 在單個基準上執行單個指令時非常給力,但在處理大量資料時就沒那麼優越了。
Next Chapter
以上就是一些關于現代計算機CPU的知識。
CPU 具有比 GPU 更大的指令集、複雜的 ALU、更好的分支預測邏輯以及更複雜的緩存/管線方案。指令周期也快得多(你的英特爾處理器可能有4GHz+, 但即便RTX3000系卡也多在2GHz左右)。
To Be Continued …
筆者不是學這個的,如果以上所寫,有什麼謬誤,大家一定指正一下,言辭激烈可以接受。