並行程式設計OpenCL 矩陣相加

2021-10-10 08:07:20 字數 4333 閱讀 3035

並行程式設計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...