OpenCL結構

原標題:從零開始學習OpenCL開發(一)架構

?

1 異構計算、GPGPU與OpenCL

? OpenCL是當前一個通用的由很多公司和組織共同發起的多CPU\GPU\其他芯片 異構計算(heterogeneous)的標準,它是跨平臺的。旨在充分利用GPU強大的并行計算能力以及與CPU的協同工作,更高效的利用硬件高效的完成大規模的(尤其是并行度高的)計算。在過去利用GPU對圖像渲染進行加速的技術非常成熟,但是我們知道GPU的芯片結構擅長大規模的并行計算(PC級的GPU可能就是CPU的上萬倍),CPU則擅長邏輯控制,因此不只局限與圖像渲染,人們希望將這種計算能力擴展到更多領域,所以這也被稱為GPGPU(即通用處計算處理的GPU)。

??? 簡單的說,我們的CPU并不適合計算,它是多指令單數據流(MISD)的體系結構,更加擅長的是做邏輯控制,而數據處理基本是單流水線的,所以我們的代碼for(i=0;...;i++)這種在CPU上要重復迭代的跑很多遍,但是你的顯卡GPU則不是這樣,GPU是典型的單指令多數據(SIMD)的體系結構,它不擅長邏輯控制,但是確實天生的向量計算機器,對于for(i=0;...;i++)這樣的代碼有時只需要跑一遍,所以圖形世界中那么多的頂點、片段才能快速的并行在顯卡中渲染處理


?

GPU的晶體管可以到幾十億個,而CPU通常只有幾個億,


如上圖是NVidia Femi100的結構,它有著大量的并行計算單元。

所以人們就想如何將更多的計算代碼搬到GPU上,讓他不知做rendering,而CPU只負責邏輯控制,這種一個CPU(控制單元)+幾個GPU(有時可能再加幾個CPU)(計算單元)的架構就是所謂的異構編程(heterogeneous),在這里面的GPU就是GPGPU。異構編程的前景和效率是非常振奮人心的,在很多領域,尤其是高并行度的計算中,效率提升的數量級不是幾倍,而是百倍千倍。

?? 其實NVIDIA在很早就退出了利用其顯卡的GPGPU計算 CUDA架構,當時的影響是很大的,將很多計算工作(科學計算、圖像渲染、游戲)的問題提高了幾個數量級的效率,記得那時NVIDIA來浙大介紹CUDA,演示了實時的ray tracing、大量剛體的互相碰撞等例子,還是激動了一下的,CUDA現在好像已經發展到了5.0,而且是NVDIA主力推的通用計算架構,但是CUDA最大的局限就是它只能使用N家自己的顯卡,對于廣大的A卡用戶鞭長莫及。OpenCL則在之后應運而生,它由極大主流芯片商、操作系統、軟件開發者、學術機構、中間件提供者等公司聯合發起,它最初由Apple提出發起標準,隨后Khronos Group成立工作組,協調這些公司共同維護這套通用的計算語言。Khronos Group聽起來比較熟悉吧,圖像繪制領域著名的軟硬件接口API規范著名的OpenGL也是這個組織維護的,其實他們還維護了很多多媒體領域的規范,可能也是類似于Open***起名的(所以剛聽到OpenCL的時候就在想它與OpenGl有啥關系),OpenCl沒有一個特定的SDK,Khronos Group只是指定標準(你可以理解為他們定義頭文件),而具體的implementation則是由不同參與公司來做,這樣你會發現NVDIA將OpenCL做了實現后即成到它的CUDA SDK中,而AMD則將其實現后放在所謂是AMD APP (Accelerated Paral Processing)SDK中,而Intel也做了實現,所以目前的主流CPU和GPU都支持OpenCL架構,雖然不同公司做了不同的SDK,但是他們都遵照同樣的OpenCL規范,也就是說原則上如果你用標準OpenCl頭中定義的那些接口的話,使用NVIDIA的SDK編的程序可以跑在A家的顯卡上的。但是不同的SDK會有針對他們芯片的特定擴展,這點類似于標磚OpenGL庫和GL庫擴展的關系。

? OpenGL的出現使得AMD在GPGPU領域終于迎頭趕上的NVIDIA,但是NVIDIA雖為OpenCL的一員,但是他們似乎更加看重自己的獨門武器CUDA,所以N家對OpenCL實現的擴展也要比AMD少,AMD由于同時做CPU和GPU,還有他們的APU,似乎對OpenCL更來勁一些。

?

2.關于在GPU上寫代碼的那些事兒

? OpenCL也是通過在GPU上寫代碼來加速,只不過他把CPU、GPU、其他什么芯片給統一封裝了起來,更高了一層,對開發者也更友好。說到這里突然很想贅述一些在GPU上寫代碼的那些歷史。。

? 其實最開始顯卡是不存在的,最早的圖形處理是放在CPU上,后來發現可以再主板上放一個單獨的芯片來加速圖形繪制,那時還叫圖像處理單元,直到NVIDIA把這東西做強做大,并且第一給它改了個NB的稱呼,叫做GPU,也叫圖像處理器,后來GPU就以比CPU高幾倍的速度增長性能。

? ?開始的時候GPU不能編程,也叫固定管線的,就是把數據按照固定的通路走完

? ?和CPU同樣作為計算處理器,順理成章就出來了可編程的GPU,但是那時候想在GPU上編程可不是容易的事,你只能使用GPU匯編來寫GPU程序,GPU匯編?聽起來就是很高級的玩意兒,所以那時使用GPU繪制很多特殊效果的技能只掌握在少數圖形工程師身上,這種方式叫可編程管線。

? ? 很快這種桎桍被打破,GPU上的高級編程語言誕生,在當時更先進的一些顯卡上(記憶中應該是3代顯卡開始吧),像C一樣的高級語言可以使程序員更加容易的往GPU寫代碼,這些語言代表有nvidia和微軟一起創作的CG,微軟的HLSL,openGl的GLSL等等,現在它們也通常被稱為高級著色語言(Shading Language),這些shader目前已經被廣泛應用于我們的各種游戲中。

? ?在使用shading language的過程中,一些科研人員發現很多非圖形計算的問題(如數學、物理領域的并行計算)可以偽裝成圖形問題利用Shading Language實現在GPU上計算,而這結果是在CPU上跑速度的N倍,人們又有了新的想法,想著利用GPU這種性能去解決所有大量并行計算的問題(不只圖形領域),這也叫做通用處理的GPU(GPGPU),很多人嘗試這樣做了,一段時間很多論文在寫怎樣怎樣利用GPU算了哪個東東。。。但是這種工作都是偽裝成圖形處理的形式做的,還沒有一種天然的語言來讓我們在GPU上做通用計算。這時又是NVIDIA帶來了革新,09年前后推出的GUDA架構,可以讓開發者在他們的顯卡上用高級語言編寫通用計算程序,一時CUDA熱了起來,直到現在N卡都印著大大的CUDA logo,不過它的局限就是硬件的限制。

? OpenCL則突破了硬件的壁壘,試圖在所有支持的硬件上搭建起通用計算的協同平臺,不管你是cpu還是gpu通通一視同仁,都能進行計算,可以說OpenCL的意義在于模糊了主板上那兩種重要處理器的界限,并使在GPU上跑代碼變得更容易。

?

??3?OpenCL架構

? 3.1 硬件層:

??上面說的都是關于通用計算以及OpenCL是什么,下面就提綱挈領的把OpenCL的架構總結一下:

? 以下是OpenCL硬件層的抽象

??

?

?它是一個Host(控制處理單元,通常由一個CPU擔任)和一堆Computer Device(計算處理單元,通常由一些GPU、CPU其他支持的芯片擔任),其中Compute Device切分成很多Processing Element,其中很多個Processing Element可以組成組為一個Computer Unit,一個Unit內的element之間可以方便的共享memory,也只有一個Unit內的element可以實現同步等操作。

3.2 內存架構


其中Host有自己的內存,而在compute Device上則比較復雜,首先有個常量內存,是所有人能用的,通常也是訪問最快的但是最稀少的,然后每個element有自己的memory,這是private的,一個組內的element有他們共用的一個local memery。仔細分析,這是一個高效優雅的內存組織方式。數據可以沿著Host-》gloabal-》local-》private的通道流動(這其中可能跨越了很多個硬件)。

3.3軟件層面的組成

?這些在SDK中都有對應的數據類型

?setup相關:

? Device:對應一個硬件(標準中特別說明多core的CPU是一個整個Device)

?

? Context:環境上下文,一個Context包含幾個device(單個Cpu或GPU),一個Context就是這些device的一個聯系紐帶,只有在一個Context上的那些Device才能彼此交流工作,你的機器上可以同時存在很多Context。你可以用一個CPu創建context,也可以用一個CPU和一個GPU創建一個。

?

Command queue:這是個給每個Device提交的指令序列

?

內存相關:

Buffers:這個好理解,一塊內存

Images:畢竟并行計算大多數的應用前景在圖形圖像上,所以原生帶有幾個類型,表示各種維度的圖像。

?

gpu代碼執行相關:

?Program:這是所有代碼的集合,可能包含Kernel是和其他庫,OpenCl是一個動態編譯的語言,代碼編譯后生成一個中間文件(可實現為虛擬機代碼或者匯編代碼,看不同實現),在使用時連接進入程序讀入處理器。

?Kernel:這是在element跑的核函數及其參數組和,如果把計算設備看做好多人同時為你做一個事情,那么Kernel就是他們每個人做的那個事情,這個事情每個人都是同樣的做,但是參數可能是不同的,這就是所謂的單指令多數據體系。

?WorkI tem:這就是代表硬件上的一個Processing Element,最基本的計算單元。

?

同步相關:

Events:在這樣一個分布式計算的環境中,不同單元之間的同步是一個大問題,event是用來同步的

?

他們的關系如下圖


?

?? 上面就是OpenCL的入門介紹,其實說實話在10年左右就跟蹤過GPGPU相關的東西,那時很多相關技術還存在于實驗室,后來的CUDA出現后,也激動過,學習過一陣,不過CUDA過度依賴于特定硬件,產業應用前景并不好,只能做做工程試驗,你總不能讓用戶裝個游戲的同時,讓他順便換個高配的N卡吧。所以一度也對這個領域不太感興趣,最近看到OpenCL的出現,發現可能這個架構還是有很好的應用前景的,也是眾多廠商目前合力力推的一個東西。想想一下一個迭代10000次的for循環一遍過,還是很激動的一件事。

? 在游戲領域,OpenCL已經有了很多成功的實踐,好像EA的F1就已經應用了OpenCL,還有一些做海洋的lib應用OpenCL(海面水波的FFT運算在過去是非常慢的),另外還有的庫干脆利用OpenCL去直接修改現有的C代碼,加速for循環等,甚至還有OpenCl版本的C++ STL,叫thrust,所以我覺得OpenCL可能會真正的給我們帶來些什么~


多謝大家關注 轉載本文請注明:http://blog.csdn.net/leonwei/article/details/8880012

?

本文將作為我《從零開始做OpenCL開發》系列文章的第一篇。

?


以下是一些關于OpenCL比較重要的資源:

http://www.khronos.org/opencl/?組織的主頁

https://developer.nvidia.com/opencl?N家的主頁

http://developer.amd.com/resources/heterogeneous-computing/opencl-zone/?A家的主頁

http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/?標準的reference

http://developer.amd.com/wordpress/media/2012/10/opencl-1.2.pdf?必看 最新的1.2版本標準

http://www.khronos.org/assets/uploads/developers/library/overview/opencl-overview.pdf?必看,入門的review

http://www.kimicat.com/opencl-1/opencl-jiao-xue-yi? 一個教學網站

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448666.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker-compose 使用小例

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 只是一個很簡單的小例。 1. 原本有的容器 2. docker-compose.yml 寫法: gentle 處可以任意寫,gentle 是我的項…

2019.6.20

今日內容 MongoDB可視化工具 一、Scrapy爬蟲框架 二、微信機器人 轉載于:https://www.cnblogs.com/jrc123/p/11062606.html

PCL點云 Lebel:Research

https://blog.csdn.net/wokaowokaowokao12345/article/details/73741957 https://blog.csdn.net/u010696366/article/category/3108337轉載于:https://www.cnblogs.com/radiumlrb/p/10986918.html

AMD GPU+VS2010的OpenCL配置

安裝開發環境可以參照DE4-530的OpenCL開發環境搭建(最終版),這篇文章的大部分內容轉載自:http://www.verydemo.com/demo_c92_i226325.html AMD的Heterogeneous Computing有很多AMD的OpenCL資料,包括各種分析工具&#…

ABP開發框架前后端開發系列---(9)ABP框架的權限控制管理

在前面兩篇隨筆《ABP開發框架前后端開發系列---(7)系統審計日志和登錄日志的管理》和《ABP開發框架前后端開發系列---(8)ABP框架之Winform界面的開發過程》開始介紹了權限管理的內容,其中只是列出了內部的權限系統的審…

GIL , 線程池 , 同步 , 異步 , 隊列 , 事件

一.什么是GIL 官方解釋:In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (Howev…

Docker - Compose 使用說明、詳解docker-compose

Compose 模板文件 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 模板文件是使用 Compose 的核心,涉及到的指令關鍵字也比較多。但大家不用擔心,這里面大部分指令…

在Windows下使用OpenCL配置

前言 目前,NVIDIA 和 AMD 的 Windows driver 均有支持OpenCL(NVIDIA 的正式版 driver 是從自195.62 版開始,而 AMD則是從9.11 版開始)。NVIDIA 的正式版 driver 中包含 OpenCL.dll,因此可以直接使用。AMD 到目前為止…

Linux下啟動mongodb

完成安裝mongodb(略) 創建數據目錄: # mkdir /data/mongo 創建配置文件 # vi /data/mongo/mongodb.cnf dbpath/data/mongo/ logpath/data/mongo/mongo.log logappendtrue forktrue port27017 或者:不創建配置文件通過mongod參數啟…

Linux調優(文件系統)

查看單個文件是否發生碎片化(被存在磁盤非連續磁盤塊上)# filefrag -v /var/log/messages 查看文件系統是否存在大量碎片(會顯示空閑離散的塊)# dumpe2fs /dev/sda1 檢查文件系統中是否有錯誤產生# fsck /dev/sdb1 1、格式化相關 …

使用 nohup 設置后臺進程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 引言: 有時候需要在Linux上設置一個后臺進程,但是當你關閉terminal之時,它會被系統kill掉&#xff0…

CVE-2019-0708 BlueKeep的掃描和打補丁

2019獨角獸企業重金招聘Python工程師標準>>> 簡介 CVE-2019-0708 BlueKeep是一個Windows遠程桌面服務的遠程代碼執行漏洞,其危害程度不亞于CVE-2017-0143 EternalBlue,該漏洞影響了某些舊版本的Windows系統。此漏洞是預身份驗證,無…

《OpenCL異構計算》新版中譯本派送中!

《OpenCL異構計算1.2》新鮮出爐,目前市面上仍一書難求!我們已向清華出版社訂購到第一批新書。關注異構開發社區,積極參與,就有可能免費獲取新書! 1.如果您異構社區的老朋友,請關注:10.1假期后我…

centOS安裝Ftp

1、查看是否安裝 rpm -q vsftpd 2、安裝方法 yum install -y vsftpd 3、查看安裝位置 whereis vsftpd 4、服務管理 //服務狀態systemctl status vsftpd.service//服務啟動systemctl start vsftpd.service//服務停止systemctl stop vsftpd.service//開啟啟動systemctl enable vs…

查看、關閉當前服務器上啟動服務 / 進程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 我用 java -jar 的方式啟動了一個服務,然后要關閉這個服務 / 進程。 1. ps -aux 查看當前進程,整個列表最 后一…

Python基礎小結

目錄 一、執行Python程序的兩種方式1.1 交互式1.2 命令行式二、執行Python程序的兩種IDE2.1 Pycharm2.2 Jupyter三、變量3.1 什么是變量?3.2 變量的組成?3.3 變量名的定義規范3.4 定義變量的兩種方式3.5 常量四、注釋4.1 單行注釋4.2 多行注釋4.3 引用計數4.4 垃圾回收機制4.…

Booster 系列之——多線程優化

項目地址:github.com/didi/booste… 對于開發者來說,線程管理一直是最頭疼的問題之一,尤其是業務復雜的 APP,每個業務模塊都有著幾十甚至上百個線程,而且,作為業務方,都希望本業務的線程優先級最…

OpenCL

OpenCL(全稱Open Computing Language,開放運算語言)是第一個面向異構系統通用目的并行編程的開放式、免費標準,也是一個統一的編程環境,便于軟件開發人員為高性能計算服務器、桌面計算系統、手持設備編寫高效輕便的代碼…

dubbo的底層原理

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、Duboo基本概念解釋 Dubbo是一種分布式服務框架。 Webservice也是一種服務框架,但是webservice并不是分布式的服務框架&…

BOM屬性對象方法

本文原鏈接:https://cloud.tencent.com/developer/article/1018747 BOM 1.window對象 2.location對象 3.history對象 BOM也叫瀏覽器對象模型,它提供了很多對象,用于訪問瀏覽器的功能。BOM缺少規范,每個瀏覽器提供商又按照自己想法…