天天看點

[學習筆記]論CUDA——你的RTX3080不止可以玩3A遊戲(Part 1 基礎技術)What is CUDA, the Compute Unified Device ArchitectureParallelismPipeliningSuperscalarSMT (Simultaneous MultiThreading)

What is CUDA, the Compute Unified Device Architecture

在全球爆炒GeForce RTX 3000系顯示卡的同時,筆者也開始重新思考除了8K Gaming外讓N卡大放光彩的特性,一個讓英偉達即使受到Intel和AMD的分庭抗禮,卻仍然在多媒體生産,資料科學,大規模計算上仍然鶴立雞群的獨特技術。

筆者指的就是CUDA,它的全稱是:

Compute Unified Device Architecture

統一計算裝置架構

[學習筆記]論CUDA——你的RTX3080不止可以玩3A遊戲(Part 1 基礎技術)What is CUDA, the Compute Unified Device ArchitectureParallelismPipeliningSuperscalarSMT (Simultaneous MultiThreading)

是英偉達研發的計算平台和程式設計模型,它利用并行計算原理在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

[學習筆記]論CUDA——你的RTX3080不止可以玩3A遊戲(Part 1 基礎技術)What is CUDA, the Compute Unified Device ArchitectureParallelismPipeliningSuperscalarSMT (Simultaneous MultiThreading)
英特爾三劍客:安德魯·葛洛夫 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 指令級平行運算

[學習筆記]論CUDA——你的RTX3080不止可以玩3A遊戲(Part 1 基礎技術)What is CUDA, the Compute Unified Device ArchitectureParallelismPipeliningSuperscalarSMT (Simultaneous MultiThreading)
指令級平行運算 的基本流程

用管線化的指令,指令通量增加了,計算機也得以在一個時鐘周期内處理多個指令。但是因為ILP本身的性質,處理器的資源還是存在閑置。

在管線晶片中,指令通量增加了。之前,一個指令花五個時鐘周期才能完成。而之後,從第五周期開始,每個周期末尾都有一個指令執行完畢(假設每步指令占用一個循環)。

注意,在非管線的晶片被認為指令之間是互相獨立的,是以不會有資料危險。而在管線晶片中,資料危險是存在的。

比如:

I1 - ADD 1 to R5
I2 - COPY R5 to R6
           
在一個管線晶片中,I1(第一條指令,下同) 從 t1(第一時鐘周期,下同) 開始,到 t5 結束。I2從t2開始,到t6結束。整數1 在 t5(WB 階段)添加到 R5 中。第二個指令在第二步(時間 t3)讀取 R5 的價值。是以,它不會擷取更新後的值,這會帶來危險。
現代編譯器會将進階語言解碼為低級語言,并處理如以上這種危險。
           

Superscalar

指令級平行運算 (ILP) 還可以通過實施超标量體系架構來實作。和管線處理器的主要差別是(超标量體系處理器也屬于管線處理器):

超标量體系架構使用同一晶片上的多個執行單元實作 ILP,而管線處理器(UE)則将執行單元分多個階段來實作。

這意味着,在超标量體系架構中,多個指令可以同時處于執行周期的同一階段。這是絕對不可能在一個簡單的管線晶片實作的。超标量微處理器可以同時執行兩個或兩個以上的指令,相對應的,他們通常至少有2個ALUs。

超标量處理器可以在同一時鐘周期中發送多個指令。這意味着多個指令可以在同一時鐘周期中開始。如果你看上面的管線架構,你會發現在一個時鐘周期中,管線處理器隻能發送一個指令。超标量體系架構的情況并非如此。但我們隻有一個指令計數器(在運作過程中,多個指令被跟蹤),這仍然隻是一個程序。

eg. Hyper-Threading 超線程

以英特爾i7-10700為例。處理器擁有 6 個獨立核心,每個核心都實作完整的 x86 ISA指令集。每個核心都帶有 2 個實體核心。

[學習筆記]論CUDA——你的RTX3080不止可以玩3A遊戲(Part 1 基礎技術)What is CUDA, the Compute Unified Device ArchitectureParallelismPipeliningSuperscalarSMT (Simultaneous MultiThreading)

Hyperthreading是一種令人興奮的技術,也是英特爾的專有技術。作業系統使用該技術将單個核心視為兩個虛拟核心,以增加管道中的硬體指令數量(請注意,并非所有作業系統都支援 HT,英特爾建議在這種情況下禁用 HT)。綜上所述,上述英特爾 i7 共有 6 個實體核心和 12 個線程。

SMT (Simultaneous MultiThreading)

HyperThreading 隻是一種更好地利用處理器核心的技術。很多時候,處理器核心隻使用其資源的一小部分來執行指令。HT 所做的僅是,它用多個CPU寄存器 ,并在處于閑置的核心部分執行更多指令。是以,一個核心可以顯示為兩個邏輯核心,但應當認為它們并非完全獨立。如果兩個“核心”都需要通路 CPU 資源,則其中一個必須等待。

這就是為什麼我們不能用超線程單核 CPU 取代雙核 CPU 的原因。

雙核 CPU 将擁有真正獨立、不需要遵循一定秩序的核心,每個核心都有自己的資源。

另請注意,HT 是英特爾實作 SMT(同時多線程)。SPARC(一款有可擴充性功能的微處理器) 對 SMT 的實作方式不同,目标相同。
[學習筆記]論CUDA——你的RTX3080不止可以玩3A遊戲(Part 1 基礎技術)What is CUDA, the Compute Unified Device ArchitectureParallelismPipeliningSuperscalarSMT (Simultaneous MultiThreading)

上圖中,

  • 粉紅色的框表示單個 CPU 核心。
  • RAM 包含 4 個不同程式,以不同的顔色表示。
  • 白格子子代表管線停頓。

CPU 使用類似于超線程的技術實作 SMT。是以,它能夠同時運作兩個不同程式(紅色和黃色)。

是以,多核CPU是合理的存在。需要注意的是,CPU旨在固定順序程式。CPU 在單個基準上執行單個指令時非常給力,但在處理大量資料時就沒那麼優越了。

Next Chapter

以上就是一些關于現代計算機CPU的知識。

CPU 具有比 GPU 更大的指令集、複雜的 ALU、更好的分支預測邏輯以及更複雜的緩存/管線方案。指令周期也快得多(你的英特爾處理器可能有4GHz+, 但即便RTX3000系卡也多在2GHz左右)。

To Be Continued …

筆者不是學這個的,如果以上所寫,有什麼謬誤,大家一定指正一下,言辭激烈可以接受。

繼續閱讀