GPU的介紹 以及原理的分析
【原文:https://blog.csdn.net/u013165704/article/details/80569424】
1 GPU是什麼
如圖1所示,這臺PC機與普通PC機不同的是這裡插了7張顯示卡,左下角是顯示卡,在中間的就是GPU晶片。顯示卡的處理器稱為圖形處理器(GPU),它是顯示卡的“心臟”,與CPU類似,只不過GPU是專為執行復雜的數學和幾何計算而設計的。
GPU計算能力非常強悍,舉個例子:現在主流的i7處理器的浮點計算能力是主流的英偉達GPU處理器浮點計算能力的1/12。
圖1 顯示卡與GPU
2 為什麼GPU計算能力如此強悍?
圖2對CPU與GPU中的邏輯架構進行了對比。其中Control是控制器、ALU算術邏輯單元、Cache是cpu內部快取、DRAM就是記憶體。可以看到GPU設計者將更多的電晶體用作執行單元,而不是像CPU那樣用作複雜的控制單元和快取。從實際來看,CPU晶片空間的5%是ALU,而GPU空間的40%是ALU。這也是導致GPU計算能力超強的原因。
圖2 cpu和gpu硬體邏輯結構對比
那有人講了,為什麼cpu不像gpu那樣設計呢,這樣計算能力也強悍了!
為什麼?CPU要做得很通用。CPU需要同時很好的支援並行和序列操作,需要很強的通用性來處理各種不同的資料型別,同時又要支援複雜通用的邏輯判斷,這樣會引入大量的分支跳轉和中斷的處理。這些都使得CPU的內部結構異常複雜,計算單元的比重被降低了。而GPU面對的則是型別高度統一的、相互無依賴的大規模資料和不需要被打斷的純淨的計算環境。因此GPU的晶片比CPU晶片簡單很多。
舉個例子,假設有一堆相同的加減乘除計算任務需要處理,那把這個任務交給一堆(幾十個)小學生就可以了,這裡小學生類似於GPU的計算單元,而對一些複雜的邏輯推理等問題,比如公式推導、科技文章寫作等高度邏輯化的任務,交給小學生顯然不合適,這時大學教授更適合,這裡的大學教授就是CPU的計算單元了,大學教授當然能處理加減乘除的問題,單個教授計算加減乘除比單個小學生計算速度更快,但是成本顯然高很多。
3 GPU程式設計庫
GPU計算能力這麼強,被廣泛使用!比如挖礦(比特幣)、圖形影象處理、數值模擬、機器學習演算法訓練等等,那我們怎麼發揮GPU超強的計算能力呢?---程式設計!
怎麼進行GPU程式設計呢?現在GPU形形色色,比如Nvidia、AMD、Intel都推出了自己的GPU,其中最為流行的就是Nvidia的GPU,其還推出了CUDA並行程式設計庫。然而每個GPU生產公司都推出自己的程式設計庫顯然讓學習成本上升很多,因此蘋果公司就推出了標準OpenCL,說各個生產商都支援我的標準,只要有一套OpenCL的程式設計庫就能對各型別的GPU晶片適用。當然了,OpenCL做到通用不是沒有代價的,會帶來一定程度的效能損失,在Nvidia的GPU上,CUDA效能明顯比OpenCL高出一大截。目前CUDA和OpenCL是最主流的兩個GPU程式設計庫。
從程式語言角度看,CUDA和OpenCL都是原生支援C/C++的,其它語言想要訪問還有些麻煩,比如Java,需要通過JNI來訪問CUDA或者OpenCL。基於JNI,現今有各種Java版本的GPU程式設計庫,比如JCUDA等。另一種思路就是語言還是由java來編寫,通過一種工具將java轉換成C。
圖3 GPU程式設計庫
LWJGL (http://www.lwjgl.org/)
JOCL (http://www.jocl.org/)
JCUDA (http://www.jcuda.de/)
Aparapi (http://code.google.com/p/aparapi/)
JavaCL (http://code.google.com/p/javacl/)
4 CUDA程式流程
圖4 CUDA程式流程
5 實踐---以影象處理為例
假設我們有如下影象處理任務,給每個畫素值加1。並行方式很簡單,為每個畫素開一個GPU執行緒,由其進行加1操作。
圖5 例子
圖6 核函式
圖7 主流程函式
6 GPU加速效果
下圖是我實現的基於CUDA的P&D DEM影象預處理演算法使用GPU的加速效果,GeForce GT 330是塊普通桌上型電腦上的顯示卡,現在價格也就500人民幣左右,用它達到了20倍的加速比,Tesla M2075是比較專業的顯示卡,價格一萬左右,用它達到了將近百倍的加速比,這個程式i7 CPU單程式單執行緒要跑2個小時,而用Tesla M2075 GPU只花了一分多鐘就完成計算。
圖8 P&D DEM影象預處理演算法加速效果
GPU英文全稱Graphic Processing Unit,中文翻譯為“圖形處理器”。
由於GPU具有高並行結構(highly parallel structure),所以GPU在處理圖形資料和複雜演算法方面擁有比CPU更高的效率。圖1 GPU VS CPU展示了GPU和CPU在結構上的差異,CPU大部分面積為控制器和暫存器,與之相比,GPU擁有更多的ALU(Arithmetic Logic Unit,邏輯運算單元)用於
資料處理,而非資料快取記憶體和流控制,這樣的結構適合對密集型資料進行並行處理。CPU執行計算任務時,一個時刻只處理一個資料,不存在真正意義上的並行,而GPU具有多個處理器核,在一個時刻可以並行處理多個資料。
GPU採用流式平行計算模式,可對每個資料進行獨立的平行計算,所謂“對資料進行獨立計算”,即,流內任意元素的計算不依賴於其它同型別資料,例如,計算一個頂點的世界位置座標,不依賴於其他頂點的位置。而所謂“平行計算”是指“多個資料可以同時被使用,多個資料並行運算的時間和1個資料單獨執行的時間是一樣的”。
圖2 GPU上的矩陣加法
圖3 GPU渲染管線
上圖3是一張典型的可程式設計GPU的流水線示意圖,其中可程式設計的頂點處理器(Vertex Shader)負責處理頂點資料流(包括位置、顏色,光照等)。因為頂點處理操作都是在空間的幾何點上進行,因此Vertex Shader對於通用計算而言非常適合於幾何操作類的計算。可程式設計片段著色器(Fragment Processor)在幾何處理和轉換完成後,負責為每個象素“畫”上正確的色彩,它的ISA(系統體系結構)類似於DSP或SSE指令集,由Folat4的SIMD執行單元和暫存器組成,處理的時候接受先從儲存器中取出2個待加元素,根據片段的位置進行向量相加,向量和以顏色的形式被儲存到儲存器中,可以當作結果輸出或在下一步運算中直接被使用。處理的一般為4個單元的向量,因為RGB三種色彩加上Alpha通道資料正好是4。片段著色器包含的TMU(Texture Mapping Unit)單元能以貼圖的形式存取視訊記憶體,因此可以被看作一個只讀存取介面。
補充:下面為我看到的文章中寫的。。先記錄下
畫素著色器負責紋理取樣和其它高階逐畫素處理,在NVIDIA SDK 9.5 的示例 VideoFilter 中, 運用畫素著色器的平行計算能力對視訊進行多種高階影象處理技術。 諸如: 模糊、銳化、 視訊混合等.
相關實現步驟如下:
(1) 建立視訊紋理管理物件;
(2) 載入視訊檔案, DirectShow 負責管理排程視訊資料;
(3) 關聯 DirectShow 視訊資料與 Direct3D 紋理物件;
(4) GPU 初始化, 關聯 CPU 頂點資料與 GPU 外部變數, 特別是 DirectShow 處理完的幀資料與 GPU 中的紋理資料關聯;
(5)頂點著色器進行紋理座標轉換和其它基於頂點的並行演算法;
(6) 畫素著色器進行紋理取樣以及其它象素級並行演算法。
相關文章
- Fiddler(1)基本介紹以及工作原理
- Hbase原理的介紹和使用場景分析
- gpu是什麼 gpu和cpu的區別介紹GPU
- 鏈式前向星介紹以及原理
- RabbitMQ 的應用場景以及基本原理介紹MQ
- RabbitMQ的應用場景以及基本原理介紹MQ
- MySQL全面瓦解22:索引的介紹和原理分析MySql索引
- 介紹GitOps的工作原理Git
- mybatis原理,配置介紹及原始碼分析MyBatis原始碼
- 常用鎖原理的介紹(上)
- Docker的原理及特性介紹Docker
- Hive的基本介紹以及常用函式Hive函式
- Kafka的原理介紹及實踐Kafka
- DAPP系統的原理與介紹APP
- FFmpeg原理介紹
- RPC模式的介紹以及簡單的實現RPC模式
- IOC和DI的概念,以及Spring框架的介紹Spring框架
- 關於keras框架的介紹以及操作使用Keras框架
- WSL 2 的安裝過程(以及介紹)
- Aspose.Words for .NET基本介紹以及功能介紹
- 輪換代理IP的工作原理介紹
- Oracle DRM原理介紹Oracle
- elastic search 原理介紹AST
- Async Commit 原理介紹MIT
- 資料中臺以及資料倉儲的介紹
- Java集合框架的概念以及常用介面的介紹Java框架
- 戶外投影的型別以及優勢介紹型別
- SAP CRM附件模型的Authorization scope原理介紹模型
- servlet的生命週期和工作原理介紹Servlet
- rxjs Observable filter Operator 的實現原理介紹JSFilter
- 什麼是影片流?影片流化工作原理以及挑戰介紹
- C++ 編譯依賴管理系統分析以及 srcdep 介紹C++編譯
- 球幕影院的應用介紹以及使用特點
- NLPIR文字分析工具的功能和特色介紹
- golang 介紹以及踩坑之四Golang
- webpack介紹以及快速配置上手Web
- 個人介紹以及希望目標
- 回溯演算法介紹以及模板演算法