1. 程式人生 > >OpenCL “速成”衝刺【第二天】

OpenCL “速成”衝刺【第二天】

OpenCL結構與模型

OpenCL結構

上一天咱們最後寫了一個OpenCL版本的Hello world程式,童鞋們肯定覺得複雜,一個hello world就這麼多程式碼,其實不是這樣的,大家注意到上邊的程式包含兩個部分,一個

cpp檔案和一個cl檔案,OpenCL的Hello world是要在GPU上執行的,那麼cl就是在GPU上執行的程式碼(一般會比C語言程式碼複雜),而GPU程式是無法直接在GPU上執行的,

而cpp檔案就是負責執行GPU程式環境的建立(也就是這部分程式碼不會隨著程式複雜而增加很多,個人很容易封裝),這兩個檔案其實就是最簡單版本的OpenCL兩個主要部分

的,異構平臺的開發框架

(OpenCL API)和在異構處理器上的程式語言(Kernel)。

OpenCL模型

OpenCL主要定義了下面四種模型:平臺模型,執行模型,記憶體模型,程式設計模型。

一般教材都是放到開頭講一下,個人感覺這樣不利於理解,所以打算將概念分解到程式中去講解。

PS:OpenCL最新版本是2.0,但是基本每個版本都是擴充,沒有本質結構的修改,一般情況推薦閱讀有2.0的上一個版本1.2。

目前準備平臺模型主要在API部分講,執行模型在kernel部分講,記憶體模型在kernel優化部分講,程式設計模型會提一下,不會講太多。

主要內容會涉及opencl規範文件的前六章。

OpenCL API (一)

咱們對應上節課的程式開始講解API,API部分不會講解的太具體,因為大多是通用的,而且文件上足夠詳細。

首先說明的是一些通用性質的,因為說了OpenCL就是庫檔案和標頭檔案,那麼也就說命令OpenCL的標頭檔案會包含很多有用的資訊,咱們就從標頭檔案開始講解。

標頭檔案包含5個部分。

第一部分,直接跳過,說明OpenCL是跨平臺的,而且雖然可用於C++,但是C語言的API,當然也有C++版本的API,實際上用的很少,本教程也不會涉及。

#ifdef __APPLE__
#include <OpenCL/cl_platform.h>
#else
#include <CL/cl_platform.h>
#endif	

#ifdef __cplusplus
extern "C" {
#endif
第二部分,自有型別定義,分兩種情況,一種是定義的結構體型別,這些不需要深究,只要能在呼叫API時使用相應的型別就行,另一種是通用型別前面加上cl_代表是在OpenCL中使用的,這些型別是用常用資料型別通用的,使用cl_型別或者常用型別對程式沒有影響,但是混合使用是非常不好的習慣,建議OpenCL相關的函式還是使用OpenCL型別。
typedef struct _cl_platform_id *    cl_platform_id;
...
typedef cl_uint             cl_bool;
...
typedef cl_uint             cl_profiling_info;
...

第三部分,錯誤程式碼,這是最重要的部分,一般API分兩種形式,一種是執行操作,返回錯誤程式碼,例如clGetPlatformIDs,clBuildProgram,一直種是返回建立物件,但是最後一個引數是錯誤程式碼的,例如clCreateContext,clCreateKernel,也就是無論什麼API都會返回一個cl_int的錯誤程式碼,0代表正確,負數代表各種錯誤,都有相應的說明,很好發現錯誤,配合文件中的API說明,多數錯誤都可以排除,所以說這是最重要的部分。

*曾經有位童鞋在網上說程式碼遇到了問題,我告訴他去看標頭檔案錯誤程式碼,他還是弄不明白,還非得按他的思路死扣API的所有引數的含義,然後卻連引數型別都弄不明白,然後我就直接勸他回去好好學學C語言了...

#define CL_SUCCESS                                  0
#define CL_DEVICE_NOT_FOUND                         -1
#define CL_DEVICE_NOT_AVAILABLE                     -2
...

第四部分,屬性定義,好多啊,而且用到的比較少,用到的碰到了相應的API再講,跳過

第五部分,API的函式宣告,有API忘記引數了,可以直接查,比翻文件速度快,也都有簡易註釋,用VS的話,自動提示引數也很方便。

/* Kernel Object APIs */
extern CL_API_ENTRY cl_kernel CL_API_CALL
clCreateKernel(cl_program      /* program */,
               const char *    /* kernel_name */,
               cl_int *        /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
...


作業

(一)除錯上節課程式,檢視所有的ret值,進行下列操作,並檢視錯誤返回值:

1.隨便替換三個不同的API的某一個引數,檢視返回值。

2.講kernel裡隨便加點錯誤的程式碼,檢視API的返回值。

3.修kernel的函式列表加上一個新引數,檢視API的返回值。

(二)編寫函式或者巨集定義,檢查返回值,並輸出錯誤型別。

相關推薦

OpenCL速成衝刺第二

OpenCL結構與模型 OpenCL結構 上一天咱們最後寫了一個OpenCL版本的Hello world程式,童鞋們肯定覺得複雜,一個hello world就這麼多程式碼,其實不是這樣的,大家注意到上邊的程式包含兩個部分,一個 cpp檔案和一個cl檔案,OpenCL的H

OpenCL速成衝刺第一

話說軟體開發從來沒有速成一說,一門語言你學的越快,說明你在別的語言上下個功夫越多,所以這次加了引號,只不過幾周之後可能會有一個公司內部OpenCL的考核,雖然本人不需要考核,不過也正好藉機整理下之前OpenCL的經驗,一方面幫著下別的同事,一方面也給自己留點幹活。這個教程

若澤資料第二linux基本命令一

1.檢視當前路徑 pwd 2.家目錄 linux系統中分為普通使用者和超級使用者,超級使用者擁有所有的許可權,普通使用者擁有部分許可權。 超級管理員對應的家目錄是:/root ,而一般使用者的家目錄是在/home/下的 3.切換目錄 cd

Unity學習第二滾球遊戲學習(Roll A Ball)

基本流程 ** 0、在基礎的地面上會有一個小球,通過控制小球的滾動,吞吃地面上的一些小塊。 1、建立基礎場景,包括地面,主角,觸碰小塊。 ① 通過材質設定修改相關物體的顏色/光滑度等顯示。 ② 重複出現的遊戲物體最好設定成prefab,以方便修改。

20170515-20170519第二2

left nbsp pad 文檔流 高度 導致 hid 重疊 影響 浮動float:right/left 1).子級浮動導致父級高度塌陷 【解決方法:1.設置寬高 2.“BFC” 3.overflow:hidden】 2.浮動的包裹性 【塊元素浮動後效果只包裹

第二典型場景:進行積分兌換功能工作序號 006 2017/07/06 場景

自己的 提示框 生成 提醒 想要 主界面 生成器 完成 免費 一、背景 1)典型用戶:李二蛋【主要】,王尼瑪【主要】 2)用戶的需求/迫切需要解決的問題 A: 李二蛋在設計任務之後,覺得設計這個任務沒什麽成就感,就不想再次參與設計任務了; 李二蛋在設計任務時希望能添加一些別

第二項目沖刺(Alpha版本) 第一次每日例會 2017/7/10

修改 圖片 頭像 str 跳轉 ont 遊戲界面 進一步 獲取本地圖片 項目沖刺(Alpha版本)第一次每日例會 開發小組:Hunter 沖刺經理:林貴淵 小組成員:吳澤斌,李明君,劉仁人,林軒宇,張太 (1)昨天做了什麽 1、吳澤斌:做了2個登錄界面和兩個界面之間

第二項目沖刺(Alpha版本)第二次每日例會 2017/7/12

數據庫 布局優化 頭像 二維碼 登錄界面 img 成員 密碼功能 style 項目沖刺(Alpha版本)第二次每日例會 開發小組:Hunter 沖刺經理:林貴淵 小組成員:吳澤斌,林軒宇,張太,劉仁人,李明君 1、每日例會內容 (1)昨天做了什麽 1、吳澤斌:繼續登錄界

Python之路第二計算機組成

時鐘頻率 space font 存儲 bit 硬件組成 第二篇 時鐘 速度慢 硬件組成:輸入單元、輸出單元、中央處理單元、存儲單元 南橋:I/O操作 北橋:CPU操作 0/1的單位稱為bit(位) bit是計算機中能識別的最小單位。 字節是計算機中最小的存儲單位。 8b

第二項目沖刺(Beta版本)第二次每日例會 2017/7/19

流程 ogre bar 功能 pan 組成 版本 logs 提交 項目沖刺(Beta版本)第二次每日例會 開發小組:Hunter 沖刺經理:林貴淵 小組成員:林軒宇,張太,劉仁人,李明君 1、每日例會內容 (1)昨天做了什麽 1、林軒宇:制作了積分商城和背包界面。 2、

第二項目沖刺(Beta版本)第三次每日例會 2017/7/19

上傳 經理 jpg 暫時 代碼 strong 傳輸 image nbsp 項目沖刺(Beta版本)第三次每日例會 開發小組:Hunter 沖刺經理:林貴淵 小組成員:林軒宇,劉仁人,張太,李明君 1、每日例會內容 (1)昨天做了什麽 1、林軒宇:註冊功能,數據庫構建

第二項目沖刺(Beta版本)第四次每日例會 2017/7/22

控件 問題 提交 昨天 nbsp 功能 上傳 用戶 jpg 項目沖刺(Beta階段)第四次每日例會 開發小組:Hunter 沖刺經理:林貴淵 小組成員:林軒宇,李明君,劉仁人,張太 1、每日例會內容 (1)昨天做了什麽 1、林軒宇:後端功能實現。 2、劉仁人:道具商城內

第二項目沖刺(Beta版本)第六次每日例會 2017/7/24

ima size 界面優化 png 整理 strong 技術 eight logs 項目沖刺(Beta版本)第六次每日例會 開發小組:Hunter 沖刺經理:林貴淵 小組成員:林軒宇,張太,李明君,劉仁人 1、每日例會內容 (1)昨天做了什麽 1、林軒宇:Button音

第二用例文檔+功能說明書+技術說明書

str password 點擊事件 註冊界面 ext 漸變 pass tdi 能說 標題一:用戶註冊後進入遊戲主頁面 角色:首次使用Hunter的用戶 主要成功場景: 用戶點擊註冊; 用戶在用戶名文本框中輸入用戶名 用戶在密碼文本框中輸入密碼 用戶在確認密碼文本框中再一次

第二項目沖刺(Beta版本)第九次每日例會 2017/7/18

實現 beta 部分 存在 昨天 其他 span 今天 優化 項目沖刺(Beta版本)第九次每日例會 開發小組:Hunter 沖刺經理:林貴淵 小組成員:林軒宇,張太,李明君,劉仁人 1、每日例會內容 (1)昨天做了什麽 1、林軒宇:道具等其他功能實現及bug修復。 2

第二項目沖刺(Release版本)第四次每日例會 2017/7/28

實現 -s 但是 道具 界面 問題 mage 差距 bug 項目沖刺(Release版本)第三次每日例會 開發小組:Hunter 沖刺經理:林貴淵 小組成員:林軒宇,張太,李明君,劉仁人 1、每日例會內容 (1)昨天做了什麽 1、林軒宇:Bug修改。 2、李明君:Bug

第二ASP.NET MVC快速入門之數據註解(MVC5+EF6)

red 數據庫結構 varchar model 菜單 錯誤提示 edi 還需 問題 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入

編程珠璣第二問題A

i++ 想是 == 散列 能夠 算法 ret 固定 無序 A題 給定一個最多包含40億個隨機排列的32位整數的順序文件,找出一個不在文件中一32位整數。有三個問題:(1)在文件中至少存在這樣一個數?(2)如果有足夠的內存,如何處理?(3)如果內存不足,僅可以用文件來進行處理

編程珠璣第二編程求解組合問題

要求 向量 har def 兩個 題目 進行 總結 步驟 組合問題 以下兩個題目是等價的: 題目1:輸入一個字符串,輸出該字符串中字符的所有組合。舉個例子,如果輸入abc,它的組合有空、a、b、c、ab、ac、bc、abc。 題目2:打印一個集合所有的子集和,比如{a,b,

編程珠璣第二書後習題解答

到來 family 轉置 是否 標識 一起 珠璣 接下來 bsp 第4題,雜技算法只交換一次,貌似比求逆快,但是時間還與cache與內存的塊交換有關,因為雜技算計訪問的數據不連續,並且每次又只訪問一個元素,頻繁的換進換出,所以實際時間長。 第6題,給每個名字編碼,將編碼一樣