CPU/顯卡GPU/CUDA/內存/緩存【轉載整理】
原博地址:CUDA-從入門到放棄
1.CPU:
(1)CPU簡介:
電子計算機的三大核心部件爲:CPU、內部存儲器和輸入輸出設備。
CPU是一塊超大規模的集成電路,是一臺計算機的運算核心(Core)和控制核心( Control Unit)。它的功能主要是解釋計算機指令以及處理計算機軟件中的數據。
CPU的結構主要包括:運算器、控制單元、寄存器、高速緩存器和它們之間通訊的數據、控制及狀態的總線。
CPU遵循的是馮諾依曼架構,其核心就是:存儲程序,順序執行。一條指令在CPU中執行的過程是這樣的:
1)讀取到指令後,通過指令總線送到控制器中進行譯碼,併發出相應的操作控制信號;
2)然後運算器(綠色區域)按照操作指令對數據進行計算;
3)並通過數據總線將得到的數據存入數據緩存器。
(2)GPU的誕生:
因爲CPU的架構中需要大量的空間去放置存儲單元和控制單元,相比之下計算單元只佔據了很小的一部分,所以它在大規模並行計算能力上極受限制,而更擅長於邏輯控制。CPU遵循順序執行,難以滿足對更大規模與更快處理速度的需求。
因此將多個處理器放在同一塊芯片上,提高了計算效率,GPU便由此誕生了。
2.顯卡/GPU/CUDA:
(1)顯卡簡介:
顯卡全稱顯示接口卡,又稱顯示適配器,是計算機最基本配置、最重要的配件之一。就像電腦聯網需要網卡,主機裏的數據要顯示在屏幕上就需要顯卡,因此,顯卡是電腦進行數模信號轉換的設備,承擔輸出顯示圖形的任務,顯卡接在電腦主板上將電腦的數字信號轉換成模擬信號讓顯示器顯示出來。
原始的顯卡一般都是集成在主板上,只完成最基本的信號輸出工作,並不用來處理數據。顯卡也分爲獨立顯卡和集成顯卡。
(2)GPU簡介:
隨着顯卡的迅速發展出現了GPU的概念,GPU是顯卡上的一塊芯片,就像CPU是主板上的一塊芯片。
GPU的構成相對簡單,有數量衆多的計算單元和超長的流水線,特別適合處理大量的類型統一的數據以及計算量大但沒有技術含量的重複運算。
GPU無法單獨工作,必須由CPU進行控制調用才能工作。CPU可單獨作用,處理複雜的邏輯運算和不同的數據類型,但當需要大量的處理類型統一的數據時,則可調用GPU進行並行計算。
GPU經過了以下幾個階段的發展:
1)僅用於圖形渲染,此功能是GPU的初衷,這一點從它的名字就可以看出:Graphic Processing Unit,圖形處理單元;
2)把浮點運算包裝成圖形渲染任務,交給GPU來做,這樣做有一個缺點,就是必須有一定的圖形學知識,否則不知道如何包裝浮點運算。
3)提出CUDA概念,使不需要圖形學知識也可以應用GPU進行運算。
(3)CUDA簡介:
CUDA是NVIDIA推出的只能用於自家GPU的並行計算框架,只有安裝這個框架才能夠進行復雜的並行計算。主流的深度學習框架也都是基於CUDA進行GPU並行加速的。還有一個cudnn是針對深度卷積神經網絡的加速庫。
CUDA在軟件方面組成有:一個CUDA庫、一個應用程序編程接口(API)及其運行庫(Runtime)、兩個較高級別的通用數學庫(CUFFT和CUBLAS)。CUDA改進了的讀寫靈活性,使得GPU與CPU的機制相吻合;另一方面,CUDA提供了片上共享內存,使得線程之間可以共享數據,應用程序可以利用共享內存來減少DRAM的數。
(4)CUDA計算能力的含義:
體現GPU計算能力的兩個重要特徵:
1)CUDA核的個數;
2)存儲器大小。
描述GPU性能的兩個重要指標: :
1)計算性能峯值;
2)存儲器帶寬。
3.內存和緩存:
(1)內存簡介:
內存是由內存芯片、電路板、金手指等部分組成的。內存的作用是用於暫時存放CPU中的運算數據,以及與硬盤等外部存儲器交換的數據,只要計算機在運行中,CPU就會把需要運算的數據調到內存中進行運算,當運算完成後CPU再將結果傳送出來,內存的運行決定了計算機的穩定運行。
內存是計算機中重要的部件之一,計算機中所有程序的運行都是在內存中進行的,因此內存的性能對計算機的影響非常大。
(2)緩存簡介:
顯存,也被叫做幀緩存,它的作用是用來存儲顯卡芯片處理過或者即將提取的渲染數據。如同計算機的內存一樣,顯存是用來存儲要處理的圖形信息的部件。
4.SDK/API/DLL:
(1)SDK:
SDK中文可譯爲“軟件開發工具包”。
SDK是一個覆蓋面很廣的名詞,輔助開發某一類軟件的相關文檔、範例和工具的集合都可以叫做SDK。通俗來說是指由第三方服務商提供的實現軟件產品某項功能的工具包,在編輯器裏敲代碼的時候它會自動補全代碼、自動檢查錯誤。
通常SDK是由專業性質的公司提供專業服務的集合,比如提供安卓開發工具、或者基於硬件開發的服務等;也有針對某項軟件功能的SDK,如推送技術、圖像識別技術、移動支付技術、語音識別分析技術等,開發者不需要再對產品的每個功能進行開發,選擇合適穩定的SDK服務並花費很少的精力就可以在產品中集成某項功能。
(2)API:
API中文可譯爲“應用程序編程接口”。
API是一些預先定義的函數,是操作系統留給應用程序的一個調用接口,應用程序通過調用操作系統的 API 而使操作系統去執行應用程序的命令(動作)。
通常指的Windows API 、DOSAPI是系統程序的一部分,它們與系統一同被載入內存並且可以通過中斷矢量表找到它們的入口。
(3)DLL:
DLL中文譯爲“動態鏈接庫”。
DLL文件內含有一些資源以及可執行代碼等,在windows環境下含有大量 .dll格式的文件,這些文件其實也是一種可執行文件格式,但與 .exe 文件不同的是.dll文件不能直接執行,它們通常由 .exe 在執行時裝入。動態鏈接庫在操作系統的底層直接與硬件打交道,應用程序通過引用DLL裏的函數可以實現程序和硬件的鏈接,這樣避免了程序和硬件直接連接,提高了應用程序的可靠性和穩定性。
(4)API與DLL的關聯和區別:
1)關聯:
API 函數封裝在各個 DLL 文件裏,DLL是API的載體,但API並不一定全用DLL實現,也可能是SYS(內核)、DRV(驅動)、OCX(控件)、LIB(靜態庫)或其它實現,所以DLL只是API實現的其中一種方式。
DLL裏面包含大量的API函數,API函數的代碼就包含在DLL中,而API函數只是DLL的一部分。
2)區別:
API是函數,可以是動態的也可以是靜態,但主要是靜態的;而DLL是動態的。靜態鏈接發生在形成可執行程序前,而動態鏈接的進行則發生在程序執行時。
API作爲操作系統提供開發應用程序的接口函數,它的實現與具體的操作系統有關;而DLL的實現與語言無關。
(5)SDK與API的關聯和區別:
1)關聯:
API通常是SDK的一部分,可以把SDK想象成一個虛擬的程序包,在這個程序包中有一份做好的軟件功能,這份程序包幾乎是全封閉的只有一個小小接口可以聯通外界,這個接口就是API。SDK配備API接口,可以對接外部系統實現二次開發。
2)區別:
a.API是一個有特定功能的函數;而SDK是一個多功能集成的工具包;
b.API是數據接口,SDK相當於開發集成工具環境,要在SDK環境下調用API;
c.API接口對接過程中需要的環境需要自己提供,SDK不僅提供開發環境還提供很多API。
5.參考資料:
(1)https://www.jianshu.com/p/8bcf60b9b050
(2)https://www.jianshu.com/p/34a504af8d51