日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C语言与OpenCL的编程示例比较

發布時間:2023/11/28 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言与OpenCL的编程示例比较 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言與OpenCL的編程示例比較
OpenCL支持數據并行,任務并行編程,同時支持兩種模式的混合。對于同步 OpenCL支持同一工作組內工作項的同步和命令隊列中處于同一個上下文中的 命令的同步。
在本文中以圖像旋轉的實例,具體介紹OpenCL編程的步驟。 首先給出實現流程,然后給出實現圖像旋轉的C循環實現和OpenCL C kernel實現。

4.2 圖像旋轉

4.2.1 圖像旋轉原理
圖像旋轉是指把定義的圖像繞某一點以逆時針或順時針方向旋轉一定的角度, 通常是指繞圖像的中心以逆時針方向旋轉。假設圖像的左上角為(l, t), 右下角為(r, b),則圖像上任意點(x, y) 繞其中心(xcenter, ycenter)逆時針旋轉θ角度后, 新的坐標位置(x’,y’)的計算公式為:
x′ = (x - xcenter) cosθ - (y - ycenter) sinθ + xcenter,
y′ = (x - xcenter) sinθ + (y - ycenter) cosθ + ycenter.
C代碼:
void rotate(
unsigned char* inbuf,
unsigned char* outbuf,
int w, int h,
float sinTheta,
float cosTheta)
{
int i, j;
int xc = w/2;
int yc = h/2;
for(i = 0; i < h; i++)
{
for(j=0; j< w; j++)
{
int xpos = (j-xc)cosTheta - (i - yc) * sinTheta + xc;
int ypos = (j-xc)sinTheta + (i - yc) * cosTheta + yc;
if(xpos>=0&&ypos>=0&&xpos<w&&ypos<h)
outbuf[ypos
w + xpos] = inbuf[i
w+j];
}
}
}

OpenCL C kernel代碼:
#pragma OPENCL EXTENSION cl_amd_printf : enable
__kernel void image_rotate(
__global uchar * src_data,
__global uchar * dest_data, //Data in global memory
int W, int H, //Image Dimensions
float sinTheta, float cosTheta ) //Rotation Parameters
{
const int ix = get_global_id(0);
const int iy = get_global_id(1);
int xc = W/2;
int yc = H/2;
int xpos = ( ix-xc)*cosTheta - (iy-yc)*sinTheta+xc;
int ypos = (ix-xc)sinTheta + ( iy-yc)cosTheta+yc;
if ((xpos>=0) && (xpos< W) && (ypos>=0) && (ypos< H))
dest_data[ypos
W+xpos]= src_data[iy
W+ix];
}

正如上面代碼中所給出的那樣,在C代碼中需要兩重循環來計算橫縱坐標上新的 坐標位置。其實,在圖像旋轉的算法中每個點的計算可以獨立進行,與其它點的 坐標位置沒有關系,所以并行處理較為方便。OpenCL C kernel代碼中用了并行 處理。
上面的代碼在Intel的OpenCL平臺上進行了測試,處理器為雙核處理器,圖像大小 為4288*3216,如果用循環的方式運行時間穩定在0.256s左右,而如果用OpenCL C kernel并行的方式,運行時間穩定在0.132秒左右。GPU的測試在NVIDIA的GeForce G105M顯卡 上進行,運行時間穩定在0.0810s左右。從循環的方式,雙核CPU并行以及GPU并行計算 已經可以看出,OpenCL編程的確能大大提高執行效率。
通過對OpenCL編程的分析和實驗可以得出,用OpenCL編寫的應用具有很好的移 植性,能在不同的設備上運行。OpenCL C kernel一般用并行的方式處理,所以能極大地提高程序的運行效率。
內存模型
一般而言,不同的平臺之間有不同的存儲系統。例如,CPU有高速緩存而GPU就沒有。 為了程序的可移植性,OpenCL定義了抽象的內存模型,程序實現的時候只需關注抽 象的內存模型,具體向硬件上的映射由驅動來完成。內存空間的定義及與硬件的映 射大致如圖所示。

內存空間在程序內部可以用關鍵字的方式指定,不同的定義與數據存在的位置 相關,主要有如下幾個基本概念[ 2 ]:
? 全局內存:所有工作組中的所有工作項都可以對其進行讀寫。工作項可以 讀寫此中內存對象的任意元素。對全局內存的讀寫可能會被緩存,這取決于設備 的能力。
? 不變內存:全局內存中的一塊區域,在內核的執行過程中保持不變。 宿主機負責對此中內存對象的分配和初始化。
? 局部內存:隸屬于一個工作組的內存區域。它可以用來分配一些變量, 這些變量由此工作組中的所有工作項共享。在OpenCL設備上,可能會將 其實現成一塊專有的內存區域,也可能將其映射到全局內存中。
? 私有內存:隸屬于一個工作項的內存區域。 一個工作項的私有內存中所定義的變量對另外一個工作項來說是不可見的。
參考鏈接:
https://www.cnblogs.com/wangshide/archive/2012/01/07/2315830.html
【1】 Aaftab Munshi. The OpenCL Specification Version1.1 Document Revision:44[M]. Khronos OpenCL Working Group. 2011.6.1.
【2】Aaftab Munshi. 倪慶亮譯. OpenCL規范 Version1.0 Document Revision:48[M]. Khronos OpenCL Working Group. 2009.10.6.
【3】Aaftab Munshi, Benedict R. Gaster, Timothy G. Mattson, James Fung, Dan Ginsburg. OpenCL Programming Guide [M]. Addison-Wesley Professional. 2011.7.23.
【4】Benedict Gaster, Lee Howes, David R. Kaeli and Perhaad Mistry. Heterogeneous Computing with OpenCL[M]. Morgan Kaufmann, 1 edition. 2011.8.31.
【5】Slo-Li Chu, Chih-Chieh Hsiao. OpenCL: Make Ubiquitous Supercomputing Possible[J]. IEEE International Conference on High Performance Computing and Communications. 2010 12th 556-561.
【6】John E. Stone, David Gohara, Guochun Shi. OpenCL: A parallel programming standard for heterogeneous computing systems[J]. Copublished by the IEEE CS and the AIP. 2010.5/6 66-72.
【7】Kyle Spafford, Jeremy Meredith, Jeffrey Vetter. Maestro:Data Orchestration and Tuning for OpenCL Devices[J]. P. D’Ambra,M.Guarracino, and D.Talia (Eds.):Euro-Par 2010,Part II,LNCS6272, pp. 275–286, 2010. \copyright Springer-Verlag Berlin Heidelberg 2010.

總結

以上是生活随笔為你收集整理的C语言与OpenCL的编程示例比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。