21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#11:
SISD 單指令單數(shù)據(jù)(Single Instruction Single Data)
SIMD 單指令多數(shù)據(jù)(Single Instruction Multiple Data)
MIMD 多指令多數(shù)據(jù)(Multiple Instruction Multiple Data)
無論多個CPU核心運行不同的程序,還是在單個CPU核心里面切換運行不同縣城的任務,
在同一時間點上,一個物理CPU核心只會運行一個線程的指令。
超線程是通過增加物理電路使一個CPU核心內(nèi)部可以維護兩個不同線程指令的狀態(tài)信息。
超線程也被叫做同時多線程。
并行計算方案:超線程和SIMD
通過一個物理CPU核心“裝作”兩個邏輯岑面的CPU核心,使得CPU可以同時運行兩個不同縣城的指令。
處理向量不同維度之間的計算時它們是相互獨立的。CPU的寄存器放得下多條數(shù)據(jù),這時可以一次取出多條數(shù)據(jù),交給CPU進行并行計算。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#12:
異常和中斷
異常:異常的前半部分即異常的發(fā)生和捕捉,在硬件層面完成;異常的后半部分即異常的處理,由軟件來完成。
CPU中斷向量表:CPU獲取異常碼之后,將當前程序的執(zhí)行線程,保存到程序棧里,查詢異常碼,處理異常,異常處理完之后,繼續(xù)執(zhí)行之前程序。
異常分為:
中斷:程序運行一般,被打斷。來自CPU外部的I/O設備,比如:鍵盤或鼠標操作。
陷阱:陷阱(Trap)。在程序種打斷點,程序運行到這個位置就會跳進陷阱。
故障:陷阱為故意觸發(fā),故障不在計劃內(nèi),需要異常處理程序取處理。
中止:CPU遇到異常無法恢復時不得不中止。
異常發(fā)生之后,需要進行一次上下文切換。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#13:
手機芯片為什么都是ARM?
復雜指令集(Complex Instruction Set Computing CISC):CPU指令集機器碼不是固定長度。
簡單指令集(Reduced Instruction Set Compution RISC):CPU指令集機器碼是固定長度。
在RISC中,只保留了最常用的20%的簡單指令,另外80%的復雜指令通過簡單指令組合起來實現(xiàn)。
這樣做的好處是RISC電路設計變簡單了,提高性能也更容易了。
程序的CPU執(zhí)行時間=指令數(shù)×CPI×Clock Cycle Time
CISC通過優(yōu)化指令數(shù),減少CPU執(zhí)行時間。
RISC通過優(yōu)化CPI,減少CPU執(zhí)行時間。
ARM正真能夠戰(zhàn)勝Intel,主要由以下幾點:
1)功耗設計。一個4核Intel i7 CPU工具130W,而ARM A8單核CPU只有2W功耗;
2)低價。ARM只設計CPU,不制造CPU。蘋果、三星、華為都拿到了基本時長上。
ARM不是開源的。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#14:
玩游戲為什么需要GPU?
圖形流水線
我們電腦里面顯示出來的3D畫面,都時通過多邊形組合出來的而不是通過相機或者攝像頭拍出來的。
對于圖像進行實時渲染的過程,可以分解成下面5個步驟:
- 頂點處理(Vertex Processing):三維頂點二維化
- 圖元處理(Primitive Processing):對不再屏幕種的圖元進行剔除和裁剪
- 柵格處化(Rasterization):二維坐標像素化
- 片段處理(Fragment Processing):計算每個像素的顏色、透明度
- 像素操作(Pixel Operations):把不同多邊形的像素混合到一起
以上五個步驟的渲染過程,我們稱之為圖形流水線(Graphic Pipeline)。
圖形渲染計算量預估
1、以屏幕分辨率640*480進行計算,屏幕上大概有30萬個像素點
2、為了讓屏幕不閃爍,我們假設屏幕刷新為60幀,即每秒刷新60次,即1800萬次單個像素渲染
3、從柵格化開始有三個流水線步驟,我們需要5400萬條指令,即54M指令
4、90年代的CPU主頻大概都在60MHz~100MHz之內(nèi),54M基本把CPU用完了。
沒有GPU,根本無法支持3D圖形顯示。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#15:
深度學習為什么需要GPU?
早期的GPU主要用于圖形計算,不可對GPU編程。
2001年從Direct3D 8.0開始,微軟第一次引入了可編程管線。一開始可編程管線僅限于頂點處理、片段處理部分。
這些可編程的接口稱之為Shader,中文名是著色器,之所以叫著色器,是因為一開始這些接口主要用來處理光照、亮度、顏色等。

一開始Sharder 分為 Vertex Shader和Fragment Shader。因為頂點處理與片段處理時順序執(zhí)行的所以同一時間一定有一半Shader是空閑的;
所以后來提出了統(tǒng)一著色器架構(Unified Shader Architecture)——在GPU里放多個一樣的Shader硬件電路,通過統(tǒng)一調(diào)度,把頂點處理、
圖元處理、片段處理都交給Shader處理。讓整個GPU盡量忙起來,這就是現(xiàn)代GPU的設計。
Shader編程了一個通用模塊,就有了把GPU拿來做各種通用計算用法,即GPGPU(General-Purpose Computing On Graphice Processing Units)
通用圖形處理器。

21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#16:
現(xiàn)代GPU的三個核心創(chuàng)意
為什么現(xiàn)代GPU在圖形渲染、深度學習上會那么快?
1、芯片瘦身
GPU基于CPU改造而來,將不需要的電路都去掉,只留下取指令、指令譯碼、ALU及執(zhí)行指令需要的寄存器和緩存。

2、多核并行和SIMT
GPU電路簡化之后,我們可以在GPU種加入多個GPU電路,就如同多核CPU一樣。
和CPU不同,GPU運算天然就是并行的,我們不需要單獨實現(xiàn)多線程計算。

GPU借鑒了CPU種SIMD,用了一種叫做SIMT(Single Instruction, Multiple Threads)的技術。
CPU種SIMD一次性去除了固定長度的多個數(shù)據(jù)放到寄存器中,用一個指令取執(zhí)行,在GPU中SIMT可以把多條數(shù)據(jù),交給不同的線程取處理。
各個線程中執(zhí)行的指令是一樣的,但是由于數(shù)據(jù)不同,可能會走到不同的分支。
相同的代碼,相同的流程,可能執(zhí)行不同的具體指令。
GPU可以進一步改進,取出的指令可以交給多個不同的ALU并行進行運算。在一個GPU核里可以放多個ALU單元。
執(zhí)行上下文可以分為兩部分,每個計算單元都有一個對應的線程上下文,共用的內(nèi)容可以放到共享上下文中。

21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#17:
GPU里的“超線程”
GPU主要以數(shù)值計算為主,但不可避免會有if..else分支,GPU中沒有CPU中對應的分支預測電路,這樣GPU也可能會出現(xiàn)流水線停頓。
如同CPU中的超線程一樣,遇到流水線停頓的時候可以調(diào)度別的計算任務給ALU,任務調(diào)度就需要保存執(zhí)行上下文,便于恢復執(zhí)行上下文。
針對這個需求,GPU中執(zhí)行上下文的個數(shù)要比計算單元ALU的個數(shù)多。

現(xiàn)在的深度學習計算,都是超大的向量和矩陣,海量的訓練樣本計算。整個計算過程中沒有復雜的邏輯和分支,非常適合GPU這樣的并行、計算能力強的架構。
Nvidia2080顯卡,共有46個SM(Streaming Multiprocessor,流失處理器)即GPU Core,46核GPU。
每個SM里面有64個Cuda Core(相當于ALU或Pixel Shader),46x64一共有2944個Shader,還有184個TMU(Texture Mapping Unit)紋理影射計算單元。
2088的主頻是1515MHz,超頻后可達1700Mhz,Nvidia顯卡,每個時鐘周期可以執(zhí)行2條指令,所以它的浮點數(shù)計算能力,是:
(2944+184)x1700Mhzx2 =10.06TFLOPS
Intel i9 9900K性能不到1TFLOPS,與Nvidia2080價格差不多,能力差10倍。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#18:
volatile 這個關鍵字有什么作用?
兩種常見誤解:
1.把volatile 當成一種鎖機制,認為給變量加上了 volatile,就好像是給函數(shù)加了 sychronized 關鍵字一樣,不同的線程對于特定變量的訪問會去加鎖;
2.把 volatile 當成一種原子化的操作機制,認為加了 volatile 之后,對于一個變量的自增的操作就會變成原子性的了。
正解:
volatile設計的目的是為了,確保我們對于這個變量的讀取和寫入,都一定會同步到主內(nèi)存里,而不是從 Cache 里面讀取。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#19:
CPU 高速緩存的寫入
1、寫入 Cache 的性能也比寫入主內(nèi)存要快,那我們寫入的數(shù)據(jù),到底應該寫到 Cache 里還是主內(nèi)存呢?如果我們直接寫入到主內(nèi)存里,Cache 里的數(shù)據(jù)是否會失效呢?
兩種策略
寫直達(Write-Through)
寫入前,先判斷是否在Cache中,如果在先更新Cache內(nèi)容再寫入主存,否則直接,寫入主存。
寫回(Write-Back)
因為我們每次讀數(shù)據(jù),都從Cache中讀,我們可以只更新Cache中的數(shù)據(jù),只有Cache中的數(shù)據(jù)被替換時才將數(shù)據(jù)同步到主存。

2、多個 CPU 核的緩存一致性的問題。
引入MESI 協(xié)議
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#20:
緩存一致性
想要實現(xiàn)緩存一致性,關鍵是要滿足兩點。
1、寫傳播,也就是在一個 CPU 核心寫入的內(nèi)容,需要傳播到其他 CPU 核心里。
2、保障事務的串行化,才能保障我們的數(shù)據(jù)是真正一致的,我們的程序在各個不同的核心上運行的結果也是一致的。
多個不同的鏈接去訪問數(shù)據(jù)庫,我們必須做到事務的串行,否則很難做到保證數(shù)據(jù)的可靠性。
需要做到兩點才可以保證事務串行
1、一個 CPU 核心對于數(shù)據(jù)的操作,需要同步通信給到其他 CPU 核心;
2、兩個 CPU 核心里有同一個數(shù)據(jù)的 Cache,那么對于這個 Cache 數(shù)據(jù)的更新,需要有一個“鎖”的概念。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#21:
MESI 協(xié)議的由來呢,來自于我們對 Cache Line 的四個不同的標記,分別是:
M:代表已修改(Modified)
對應Cache中標記為臟的數(shù)據(jù)
E:代表獨占(Exclusive)
表示這個數(shù)據(jù)只在當前Cache,可以隨意修改
S:代表共享(Shared)
表示數(shù)據(jù)在多個Cache,修改需要通知其他Cache
I:代表已失效(Invalidated)
表示數(shù)據(jù)已失效
MESI 協(xié)議有限狀態(tài)機
