並行程式設計opencl-矩陣相加
(1)host端**:
#include
#include
#include
#include
const
int array_size =
1000
;//一、 選擇opencl平台並建立乙個上下文
cl_context createcontext()
//建立乙個opencl上下文環境
cl_context_properties contextproperties=
; context =
clcreatecontextfromtype
(contextproperties, cl_device_type_gpu,
null
,null
,&errnum)
;return context;
}//二、 建立裝置並建立命令佇列
cl_command_queue createcommandqueue
(cl_context context, cl_device_id* device)
// 為裝置分配快取空間
devices = new cl_device_id[devicebuffersize /
sizeof
(cl_device_id)];
errnum =
clgetcontextinfo
(context, cl_context_devices, devicebuffersize, devices,
null);
//選取可用裝置中的第乙個
commandqueue =
clcreatecommandqueue
(context, devices[0]
,0,null);
*device = devices[0]
; delete[
] devices;
return commandqueue;
}// 三、建立和構建程式物件
cl_program createprogram
(cl_context context, cl_device_id device,
const
char
* filename)
std:
:ostringstream oss;
oss << kernelfile.
rdbuf()
; std:
:string srcstdstr = oss.
str();
const
char
* srcstr = srcstdstr.
c_str()
; program =
clcreateprogramwithsource
(context,1,
(const
char**
)&srcstr,
null
,null);
errnum =
clbuildprogram
(program,0,
null
,null
,null
,null);
return program;
}//建立和構建程式物件
bool creatememobjects
(cl_context context, cl_mem memobjects[3]
,float
* a,
float
* b)
// 釋放opencl資源
void
cleanup
(cl_context context, cl_command_queue commandqueue,
cl_program program, cl_kernel kernel, cl_mem memobjects[3]
)if(commandqueue !=0)
clreleasecommandqueue
(commandqueue);if
(kernel !=0)
clreleasekernel
(kernel);if
(program !=0)
clreleaseprogram
(program);if
(context !=0)
clreleasecontext
(context);}
intmain
(int argc,
char
** ar**)
; cl_int errnum;
// 一、選擇opencl平台並建立乙個上下文
context =
createcontext()
;// 二、 建立裝置並建立命令佇列
commandqueue =
createcommandqueue
(context,
&device)
;//建立和構建程式物件
program =
createprogram
(context, device,
"helloworld.cl");
// 四、 建立opencl核心並分配記憶體空間
kernel =
clcreatekernel
(program,
"hello_kernel"
,null);
//建立要處理的資料
float result[array_size]
;float a[array_size]
;float b[array_size]
;for
(int i =
0; i < array_size; i++
)//建立記憶體物件if(
!creatememobjects
(context, memobjects, a, b)
)// 五、 設定核心資料並執行核心
errnum =
clsetkernelarg
(kernel,0,
sizeof
(cl_mem)
,&memobjects[0]
);errnum |
=clsetkernelarg
(kernel,1,
sizeof
(cl_mem)
,&memobjects[1]
);errnum |
=clsetkernelarg
(kernel,2,
sizeof
(cl_mem)
,&memobjects[2]
);size_t globalworksize[1]
=;size_t localworksize[1]
=;errnum =
clenqueuendrangekernel
(commandqueue, kernel,1,
null
, globalworksize, localworksize,0,
null
,null);
// 六、 讀取執行結果並釋放opencl資源
errnum =
clenqueuereadbuffer
(commandqueue, memobjects[2]
, cl_true,
0, array_size *
sizeof
(float
), result,0,
null
,null);
for(
int i =
0; i < array_size; i++
) std:
:cout << std:
:endl;
std:
:cout <<
"executed program succesfully."
<< std:
:endl;
getchar()
;cleanup
(context, commandqueue, program, kernel, memobjects)
;return0;
}
gpu程式執行
__kernel void
hello_kernel
(__global const
float
*a, __global const
float
*b, __global float
*result)
OpenCL做並行濾波
本實驗主要進行opencl一維訊號的濾波 主要思路是以離散訊號的序列點作為目標,乙個工作項負責乙個訊號點的計算 這樣做的好處是方便,相對於序列實現獲得相當大的效能提公升 但是每個工作項負載不均衡。host.c include include include include pragma warnin...
OpenCL加速矩陣運算
opencl運用並行的方法加速矩陣運算,在業界得到廣泛運用,博主也試了一試,挺好玩的。注意 1 opencl針對的資料量越大,加速效果越明顯 2 opencl版本測試在nvidia730上,cuda7.5下的opencl檔案,windows7 3 opencl sdk位於c program file...
OpenCL與異構平行計算
異構平行計算包含兩個子概念 異構和並行。1 異構是指異構平行計算需要同時處理多個不同架構的計算平台的問 題,比如目前主流的異構平行計算平台x86 gpu x86 fpga,以及目前正在研發中的arm power gpu。2 並行是指異構平行計算主要採用並行的程式設計方式,無論是x86處理器,還是ar...