精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

蘋果開發語言OpenCL 變量地址限定符詳解 附源碼

移動開發 iOS
本文介紹的是蘋果開發語言OpenCL 變量地址限定符詳解,富有源碼可以參考學習,先來看內容。

蘋果開發語言OpenCL 變量地址限定符詳解是本文要介紹的內容,首先我們先來了解OpenCL,即:Open Computing Language,是由蘋果公司起草設計的用于大規模并行計算的計算編程語言。CocoaChina 版主 “zenny_chen” 今天為我們帶來新的一篇 OpenCL 教程:變量地址限定符。

我們的示例程序是通過OpenCL來實現一個正方形的顏色漸變著色。這里,我們將牽涉到變量存儲屬性,另外還引入了向量數據,向量數據是如何操作的,向量數據與標量數據是如何交叉操作的。

請先下載完整的工程文件 OpenCL_shading.zip (36 K) ,下面是 OpenCL 內核代碼。

  1. // Render a square  
  2. // left-top:    red(1, 0, 0)  
  3. // left-bottom: green(0, 1, 0)  
  4. // right-top:   blue(0, 0, 1)  
  5. // right-bottom:black(0, 0, 0)  
  6.  
  7. __constant float4 left_top        = (float4)(1.0f, 0.0f, 0.0f, 0.0f);  
  8. __constant float4 left_bottom     = (float4)(0.0f, 1.0f, 0.0f, 0.0f);  
  9. __constant float4 right_top       = (float4)(0.0f, 0.0f, 1.0f, 0.0f);  
  10. __constant float4 right_bottom    = (float4)(0.0f, 0.0f, 0.0f, 0.0f);  
  11. __kernel void ColorShading(  
  12.                     __global float4 output[256][256]  
  13.                     )  
  14. {  
  15.     int dimX = get_global_id(0);  
  16.     int dimY = get_global_id(1);  
  17.     __local float4 deltaLeft = (left_top - left_bottom) / 255.0f;  
  18.     __local float4 deltaRight = (right_top - right_bottom) / 255.0f;  
  19.  
  20.     float4 left = left_bottom + deltaLeft * (float)dimY;  
  21.     float4 right = right_bottom + deltaRight * (float)dimY;  
  22.     float4 delta = (right - left) / 255.0f;  
  23.     float4 result = left + delta * (float)dimX;  
  24.  
  25. // clamp  
  26.     if(result.x > 1.0f)  
  27.         result.x = 1.0;  
  28.     if(result.y > 1.0f)  
  29.         result.y = 1.0f;  
  30.     if(result.x < 0.0f)  
  31.         result.x = 0.0f;  
  32.     if(result.y < 0.0f)  
  33.         result.y = 0.0f;  
  34.  
  35.     output[dimY][dimX] = result + (float4)(0.0f, 0.0f, 0.0f, 1.0f);  

我們首先來談談向量類型

上述代碼中,我們引入了float4類型。它是一個向量類型。向量類型的定義規則是在基本類型后加n,n可以是2,4,8,16。比如:uchar8,float2,int16,long4等等。

而對于向量類型各分量的訪問,如果向量的分量個數在4個以內,我們可以依次用x,y,z,w來表示。這種標識法是與OpenGL Shader中的vertex shader對向量分量的訪問形式一樣。

另外,我們還可以用數值索引來訪問一個向量的各個分量。這個時候,我們可以將一個向量變量視為一個數組。如果向量的元素個數是16,那么第0到第9個元素分別用索引0到9表示;而第10到第15個元素,我們用a到f或A到F(即十六進制)來表示。而當我們用索引來表示的話,向量變量的.的后面必須跟一個字母 s。

下面舉些例子:

  1. int4 a = int4(1, 2, 3, 4); 

那么a.x是1;a.y是2;a.z是3;a.w是4。同樣,a.s0是1;a.s1是2;a.s2是3;a.s3是4。

對于向量變量,我們還能非常靈活地對其各個分量進行賦值。我們這里再引入一個swizzle的概念。swizzle是指可以對一個向量用另一個向量所對應的任意元素進行賦值。比如說:

  1. int4 a = int4(1, 2, 3, 4);  
  2. int4 b = a.wzyx; 

這表示用a的第3個元素賦給b的第0個元素;a的第2個元素賦給b的第1個元素;用a的第1個元素賦給b的第2個元素;用a的第0個元素賦給b的第3個元素。然后,我們還能這么做:

  1. b.xz = a.s32; 

表示將a的第三個元素給b的第0個元素;a的第2個元素賦給b的第2個元素。是不是很靈活呢?呵呵。

向量變量之間的加、減、乘、除以及邏輯運算都是針對向量所對應的各個分量進行的。比如說上面的int4 a; int4 b;a *= b; 相當于:a.x *= b.x; a.y *= b.y; a.z *= b.z; a.w *= b.w;

如果一個向量與一個標量進行計算,那么是將該標量與向量的沒個分量做相同的運算,比如:

  1. int4 a;  
  2. int i;  
  3. a *= i; 

相當于:a.x *= i; a.y *= i; a.z *= i; a.w *= i;

而i *= a;則是非法的。因此我們必須注意,在用向量與標量做算術邏輯操作時,必須把向量放在操作符的左邊,而標量要放在操作符的右邊。

上述代碼中:

  1. // clamp  
  2.     if(result.x > 1.0f)  
  3.         result.x = 1.0;  
  4.     if(result.y > 1.0f)  
  5.         result.y = 1.0f;  
  6.     if(result.x < 0.0f)  
  7.         result.x = 0.0f;  
  8.     if(result.y < 0.0f)  
  9.         result.y = 0.0f;  

這部分是分別對結果的r分量和g分量做飽和。那么這里,我們將引入一個OpenCL內建函數來取代這些代碼。OpenCL內建函數一般是GPU指 令集直接支持的,因此一個調用基本上只需要1條指令就能完成。所以我們在寫OpenCL時可以盡量使用內建函數。當然,有些數學內建函數為了效率會犧牲精 度,此時我們要自己判斷取舍。

我們接下去再介紹一個OpenCL的內建函數——

  1. gentype clamp (gentype x, gentype minval,  
  2. gentype maxval) 

其語義是返回:fmin(fmax(x, minval), maxval),即對一個向量的每個分量取minval和maxval范圍內的值。如果超出下界,那么取minval;如果超出上界,那么取maxval。

那么我再對OpenCL程序做次更新:

  1. // Render a square  
  2. // left-top:    red(1, 0, 0)  
  3. // left-bottom: green(0, 1, 0)  
  4. // right-top:   blue(0, 0, 1)  
  5. // right-bottom:black(0, 0, 0)  
  6.    
  7. __constant float4 left_top        = (float4)(1.0f, 0.0f, 0.0f, 0.0f);  
  8. __constant float4 left_bottom     = (float4)(0.0f, 1.0f, 0.0f, 0.0f);  
  9. __constant float4 right_top       = (float4)(0.0f, 0.0f, 1.0f, 0.0f);  
  10. __constant float4 right_bottom    = (float4)(0.0f, 0.0f, 0.0f, 0.0f);  
  11.    
  12. __constant float4 minValue = (float4)(0.0f, 0.0f, 0.0f, 0.0f);  
  13. __constant float4 maxValue = (float4)(1.0f, 1.0f, 1.0f, 0.0f);  
  14.    
  15. __kernel void ColorShading(  
  16.                     __global float4 output[256][256]  
  17.                     )  
  18. {  
  19.     int dimX = get_global_id(0);  
  20.     int dimY = get_global_id(1);  
  21.    
  22.     __local float4 deltaLeft = (left_top - left_bottom) / 255.0f;  
  23.     __local float4 deltaRight = (right_top - right_bottom) / 255.0f;  
  24.    
  25.     float4 left = left_bottom + deltaLeft * (float)dimY;  
  26.     float4 right = right_bottom + deltaRight * (float)dimY;  
  27.     float4 delta = (right - left) / 255.0f;  
  28.     float4 result = left + delta * (float)dimX;  
  29.    
  30.     // clamp  
  31.     result = clamp(result, minValue, maxValue);  
  32.    
  33.     output[dimY][dimX] = result + (float4)(0.0f, 0.0f, 0.0f, 1.0f);  

***,我們討論一下本文章的主題——變量的地址空間限定符

OpenCL有四種地址空間限定符——全局的(__global或global),本地的(__local或local),常量的(__constant或constant),私有的(__private或private)。

全局地址空間用于引用從全局存儲空間池所分配的存儲器對象。該存儲器對象可以聲明為指向一個標量的指針,指向一個向量的指針或用戶自定義的結構的指針。這允許內核程序讀或寫該緩存的任意位置。這里要注意的是,__global(或global)所修飾的是指針變量所引用的地址。因此:

  1. __global long4 g;    // Error  
  2. __global image2d_t texture;    // OK. A 2D texture image  
  3.  
  4. void kernelMain(__global int *p    // OK  
  5.                              )  
  6. {  
  7.     __global float4 a;    // Error  

本地地址空間用于描述需要被分配在本地存儲空間的變量,并且能被一個工作組的所有工作項共享。該限定符可以被用于函數實參或在函數內聲明的聲明的變量。而用于修飾函數實參時,變量必須是指針類型。

常量地址空間用于描述分配在全局存儲空間的變量,并且它們在內核程序中是只讀的。這些全局只讀變量可以被所有工作組的所有工作項共享。
該限定符在可以用于修飾內核函數的指針變量參數,或是在內核函數中修飾指針變量,或是作為全局變量。在本例中,我們把__constant修飾全局變量。
這里還要注意的是,由于__constant變量不能被寫,因此,作為全局變量時,它必須聲明后立即用常量初始化。這里的常量是指在編譯時能計算出數值結果的表達式。

私有地址空間的范圍很廣。所有函數參數、函數內定義的局部變量都是私有的。因此我們往往可以省略掉__private關鍵字。

這里要注意的是OpenCL支持const關鍵字。這個關鍵字只在編譯時進行檢查,它所修飾的變量不能被修改,而對運行時該變量分配在哪個存儲空間無關。

***對這些關鍵字與實際性能的影像做一下簡單的介紹。當前流行的GPU等HPC流處理器采用分層的存儲架構。全局存儲空間非常大(就相當于我們所說的顯存,目前最少也有128MB,俺的Mac Mini就是這個大小),但是帶寬很昂貴,因此數據傳輸也是最慢的。

而第二層是局部存儲空間,或稱為本地存儲空間。局部存儲空間只能被一個工作組的所有工作項共享,并且每個工作組都有自己獨立的一個局部存儲空間。而每個局部存儲空間比較小,一般在128KB左右吧。但是其數據傳輸性能要比全局存儲器要大很多。

私有存儲空間是每個工作項私有的。也就是說每個工作項有自己獨立的私有存儲空間。這在GPU存儲架構中實際上就是寄存器文件。寄存器文件比如一共 128KB,那么對所有工作項進行劃分的話,那么每個工作項能分到的存儲空間就非常小。但是寄存器的訪問是最快的,讀或寫一次只需要1個周期。

小結:蘋果開發語言OpenCL 變量地址限定符詳解的內容介紹完了,希望本文對你有所幫助!

推薦一篇相關的文章:蘋果開發語言OpenCL 多線程同步 附源碼

責任編輯:zhaolei 來源: CocoaChina
相關推薦

2011-07-20 10:50:19

蘋果 OpenCL 多線程

2011-06-20 13:54:41

Qt 動態 切換

2018-05-13 16:00:22

主播APP視頻

2020-02-12 14:03:29

網頁設計網頁游戲設計

2023-05-26 16:34:31

HBase數據模型

2011-09-13 17:03:16

Eclipse And

2021-10-29 08:19:54

JMeterJava java sample

2021-11-30 11:04:36

C++函數語言

2010-02-03 15:40:11

C++地址運算符

2025-05-26 08:20:00

const編程代碼

2011-08-05 10:01:23

Xcode Interface

2013-06-17 15:41:09

Windows PhoWP開發JSON生成C#類

2014-06-06 09:13:28

SwiftSwift編程

2024-05-15 08:54:04

C++類型限定符代碼

2014-07-09 09:13:16

Web效果Web特效

2010-09-17 09:34:29

開發工具Windows Pho

2011-04-12 15:03:26

C語言編程位操作

2010-11-09 09:51:52

匯編語言

2011-04-15 10:40:23

web開發框架

2010-10-25 09:54:09

Windows Pho
點贊
收藏

51CTO技術棧公眾號

色偷偷一区二区三区| 不卡的av中国片| 精品精品国产国产自在线| 无套白嫩进入乌克兰美女| 91精品国产黑色瑜伽裤| 久久精品欧美一区二区三区不卡| 国产欧美婷婷中文| 天堂资源在线播放| 欧洲激情视频| 精品盗摄一区二区三区| av丝袜天堂网| 久久亚洲资源| 国产精品欧美久久久久无广告| av免费观看久久| 真实的国产乱xxxx在线91| 精品999成人| 亚洲人a成www在线影院| aaa黄色大片| 久久国内精品| 欧美午夜精品久久久久久久| 欧美 日韩 国产 在线观看| 四虎电影院在线观看| 国内精品在线播放| 国产精品www网站| 成年人免费看毛片| 欧美va天堂在线| 色一情一乱一区二区| 欧美熟妇一区二区| 韩国精品福利一区二区三区| 欧美一区二区在线看| 91香蕉视频导航| 碰碰在线视频| 亚洲va欧美va天堂v国产综合| 一级日韩一区在线观看| 国内精品一区视频| 久久这里都是精品| 久久66热这里只有精品| 亚洲a视频在线| 国产精品888| 成人网在线视频| 影音先锋国产在线| 日本在线不卡视频| 国产成人小视频在线观看| 在线免费观看毛片| 一区三区视频| 欧美精品videos另类日本| 手机在线免费看片| 欧美第一精品| 久久久91精品| 欧美三级黄色大片| 我不卡手机影院| 久热在线中文字幕色999舞| 日韩黄色中文字幕| 成人羞羞动漫| 日韩中文字幕在线| 亚洲欧美另类日本| 91精品高清| 欧美超级乱淫片喷水| 日韩成人短视频| 91精品动漫在线观看| 欧美丰满少妇xxxxx做受| 一区二区视频免费看| 亚洲精品97| 欧美大学生性色视频| 国产在线免费视频| 国产一级久久| 国产aⅴ夜夜欢一区二区三区 | 亚洲国产精品久久艾草纯爱| 日本xxxxx18| 女囚岛在线观看| 亚洲成av人片| wwwxxx黄色片| 色婷婷成人网| 欧美xxxx老人做受| 亚洲欧美色图视频| 精品国产成人| 麻豆乱码国产一区二区三区| 青青操视频在线播放| 精品动漫3d一区二区三区免费| 91精品国产成人| 波多野结衣家庭主妇| 卡一卡二国产精品| 91九色在线观看| 亚洲 小说区 图片区 都市| 国产欧美一区二区精品性色| 中文字幕在线乱| 91美女精品| 欧美性猛交一区二区三区精品| 国产精品自在自线| 女仆av观看一区| 永久免费毛片在线播放不卡| 国产一区二区播放| 亚洲欧美日韩国产| 成人福利在线视频| 亚洲av毛片成人精品| 国产精品女主播在线观看| 日韩亚洲欧美视频| 国产精品麻豆成人av电影艾秋| 欧美一级在线视频| 国产美女免费网站| 国一区二区在线观看| 国产精品美腿一区在线看| 精品国自产拍在线观看| 久久久久久**毛片大全| 成人在线视频一区二区三区| 日韩伦理三区| 精品盗摄一区二区三区| 2014亚洲天堂| 亚洲免费在线| 91亚洲精品丁香在线观看| 成人三级黄色免费网站| 亚洲一区在线播放| 伊人色在线观看| 亚洲动漫在线观看| 久久久久久亚洲精品不卡| 一级成人免费视频| 久久嫩草精品久久久精品| 欧美黑人在线观看| 亚洲国产91视频| 亚洲色图第三页| 日韩精品国产一区二区| 国产成人综合自拍| 中文字幕在线乱| 久久青草免费| 一区二区三区亚洲| 成人免费a视频| 成人网在线免费视频| 精品一区二区成人免费视频 | 欧美日韩一区二区三区四区| 日本少妇毛茸茸| 欧美三级网页| 亚洲精品免费一区二区三区| 91精彩视频在线播放| 日本道精品一区二区三区| 国产精品无码毛片| 亚洲高清不卡| 国产欧美一区二区三区另类精品| www久久日com| 91麻豆精品国产91久久久| 在线观看免费黄色网址| 视频一区国产视频| 欧美日韩一区二区三| 中文字幕资源网在线观看免费 | 日韩欧美在线观看一区二区三区| 国产精品av久久久久久无| 久久九九99| 欧美日韩在线一二三| 深夜福利视频一区二区| 日韩精品在线免费| 亚洲天堂五月天| 国产欧美日韩视频在线观看| 99视频精品免费| 菠萝蜜一区二区| 国产日韩在线精品av| 日本成人在线播放| 欧美一区二区久久| 久久综合成人网| 99久久免费精品高清特色大片| www精品久久| 免费久久精品| 国产精品露脸自拍| 国产剧情在线| 精品毛片乱码1区2区3区| 日本少妇激情舌吻| 久久先锋影音av| 亚洲综合av在线播放| 中文字幕人成人乱码| 国产麻豆日韩| 欧美xoxoxo| 日韩亚洲精品视频| www.狠狠干| 欧美日韩精品在线视频| www亚洲色图| 紧缚奴在线一区二区三区| 国产精品三级一区二区| 欧美毛片免费观看| 国产精品电影网| 在线视频中文字幕第一页| 亚洲国产三级网| 久久精品国产亚洲av麻豆蜜芽| 国产精品美女久久久久久久| 亚洲午夜精品在线观看| 亚洲伊人观看| 一区二区三区视频| 国产成人精品亚洲线观看| 国产v综合ⅴ日韩v欧美大片| 人人干在线视频| 亚洲成人在线网| 中文区中文字幕免费看| 夜色激情一区二区| 成人黄色a级片| 成人免费毛片高清视频| 美女网站视频黄色| 亚洲高清网站| 正在播放亚洲| 色婷婷av一区二区三区丝袜美腿| 国产精品久久久久久网站 | 欧美一区电影| 成人自拍网站| 欧美国产日韩电影| 孩xxxx性bbbb欧美| 免费黄色在线观看| 亚洲美女久久久| 精品国产区一区二| 欧美性猛片xxxx免费看久爱| 97免费在线观看视频| 自拍偷拍欧美精品| 波多野结衣a v在线| 国产成a人亚洲| 九九九九九国产| 久久综合中文| 国产v片免费观看| 综合色一区二区| 天堂√在线观看一区二区| 久久丝袜视频| 岛国一区二区三区高清视频| 外国成人毛片| 国产成人一区二区三区| 国产偷倩在线播放| 超碰97人人做人人爱少妇| 欧洲亚洲在线| 日韩精品免费观看| 亚洲欧美高清视频| 欧美一区三区二区| 国产一区二区三区四区视频| 日本韩国精品在线| 五月天婷婷久久| 性欧美疯狂xxxxbbbb| 精品99久久久久成人网站免费| 国产精品毛片久久久久久久| 亚洲精品乱码久久久久久久久久久久| 成人禁用看黄a在线| 肉丝美足丝袜一区二区三区四| 久久狠狠亚洲综合| 一区二区三区 日韩| 日韩电影网1区2区| 熟女人妇 成熟妇女系列视频| 欧美亚洲视频| 黄色免费视频大全| 国产精品腿扒开做爽爽爽挤奶网站| 免费超爽大片黄| 黄色av一区| 欧美一级免费播放| 在线看片一区| 精品国产一区三区| 一区二区三区精品视频在线观看| 欧美日韩精品在线一区二区| 亚洲黄色成人| 激情综合在线观看| 麻豆九一精品爱看视频在线观看免费| www.玖玖玖| 久久久久久穴| www亚洲成人| 国产在线视频不卡二| 亚洲精品鲁一鲁一区二区三区 | 3d动漫啪啪精品一区二区免费 | 丰满人妻一区二区三区53号| 综合久久十次| 成人毛片一区二区| 久久一二三区| 在线观看免费不卡av| 国产精品正在播放| 国产伦精品一区二区免费| xf在线a精品一区二区视频网站| xxx在线播放| 成人免费视频在线观看| 九九视频免费看| 精品国产乱码久久久久久天美| 国产剧情在线视频| 欧美日韩国产高清一区二区| 国产成人精品亚洲精品色欲| 精品国产一区二区精华| 三级av在线播放| 日韩在线观看免费全集电视剧网站| 大片免费在线看视频| 久久久久久久久久久人体| 理论片午夜视频在线观看| 国产精品igao视频| 国产美女精品视频免费播放软件| 99视频免费观看蜜桃视频| 国产99久久| 黄色网络在线观看| 一本色道久久| 网站在线你懂的| 91在线精品一区二区| 九九热久久免费视频| 五月婷婷久久丁香| 在线观看国产精品视频| 精品国免费一区二区三区| 免费黄色片在线观看| 久久精品小视频| 午夜激情在线播放| 91青青草免费观看| 精品视频日韩| 亚洲精品久久久久久久蜜桃臀| 久久精品一区二区国产| 国产xxx在线观看| 国产精品三级视频| 天天操天天摸天天干| 在线不卡欧美精品一区二区三区| 五月天婷婷激情网| 久久精品中文字幕一区| 国模一区二区| 精品久久久久久中文字幕动漫| 欧美大黑bbbbbbbbb在线| 精品中文字幕av| 国产成人在线免费观看| 卡一卡二卡三在线观看| 午夜精品久久久久久久久久| 91精品国产乱码久久久| 亚洲欧洲av一区二区| 欧美亚洲系列| 亚洲淫片在线视频| 欧美精品尤物在线观看| av7777777| 成人一区在线看| caoporn91| 欧美日韩久久久一区| 美女做暖暖视频免费在线观看全部网址91| 久久成人av网站| 福利视频亚洲| 茄子视频成人在线观看| av成人天堂| 久久久久久久人妻无码中文字幕爆| 亚洲欧美经典视频| 中文字幕 欧美激情| 亚洲天堂第一页| 亚洲黄色网址| 久久综合狠狠综合久久综青草| 国内精品福利| 精品人妻无码中文字幕18禁| 亚洲欧美国产高清| 国产国语亲子伦亲子| 久久精品电影网站| 亚洲成人a级片| www亚洲国产| 激情综合一区二区三区| 亚洲国产精品一区二区久久hs| 在线观看网站黄不卡| 国产一级在线| 国产精品福利在线| 波多野结衣在线播放一区| 日本人视频jizz页码69| 亚洲国产精品高清| 亚洲午夜精品久久久| 久久精品视频免费播放| 警花av一区二区三区| 特级西西444| 不卡一二三区首页| 国产精品久久久免费视频| 精品视频—区二区三区免费| 午夜激情在线播放| 日韩在线导航| 奇米四色…亚洲| 免费成人深夜夜行网站| 日韩一级精品视频在线观看| 欧洲在线视频| 久久久精彩视频| 日韩高清在线一区| 情侣偷拍对白清晰饥渴难耐| 欧美日韩另类国产亚洲欧美一级| 国产在线观看av| 国产精品国产精品| 久久国产精品久久w女人spa| 青娱乐国产视频| 在线电影国产精品| 啊啊啊久久久| 色吧亚洲视频| 国产福利91精品| 成人午夜视频精品一区| 在线亚洲欧美视频| 久久伦理中文字幕| 好吊妞无缓冲视频观看| 欧美极品xxx| 亚洲乱码国产乱码精品精软件| 国内久久久精品| 成人3d精品动漫精品一二三| 国产精品探花在线播放| 亚洲国产三级在线| 国产香蕉在线| 91精品国产99久久久久久红楼 | 久热av在线| 成人一区二区电影| 亚洲人成久久| www.99re6| 亚洲精品第一国产综合精品| 91p九色成人| 男女猛烈激情xx00免费视频| 国产欧美一区二区精品性色超碰| 国产福利视频导航| 国产在视频一区二区三区吞精| 成人妇女免费播放久久久| 精品二区视频| 久久久久久久久久97| 亚洲成人av片| 欧美成a人片免费观看久久五月天| 日本男女交配视频| 中文字幕久久午夜不卡| 日本黄色三级视频| 国产免费一区二区三区在线能观看|