opencl矩陣點乘運算及遇到的問題總結

2021-06-28 13:01:55 字數 2539 閱讀 4861

matvec

#define program_file "matvec.cl"

#define kernel_func "matvec_mult"

#include #include#include #include#include int main();

cl_mem mat_buff,vec_buff,res_buff;//核心引數

for(i = 0;i<16;i++)

for(i=0;i<4;i++)

//配置平台,配置上下文

clgetplatformids(1,&platform,null);

clgetdeviceids(platform,cl_device_type_gpu,1,&device,null);

context = clcreatecontext(null,1,&device,null,null,&err);

//讀取程式檔案

program_handle = fopen(program_file,"r");

fseek(program_handle,0,seek_end);

program_size = ftell(program_handle);

rewind(program_handle);

program_buffer = (char*)malloc(program_size+1);

program_buffer[program_size] = '\0';

fread(program_buffer,sizeof(char),program_size,program_handle);

fclose(program_handle);

//編譯程式

program = clcreateprogramwithsource(context,1,(const char**)&program_buffer,&program_size,&err);

free(program_buffer);

//建立核心佇列

clbuildprogram(program,0,null,null,null,null);

//建立核心佇列

kernel = clcreatekernel(program,kernel_func,&err);

queue = clcreatecommandqueue(context,device,0,&err);

//設定核心引數

mat_buff = clcreatebuffer(context,cl_mem_read_only | cl_mem_copy_host_ptr,sizeof(float)*16,mat,&err);

vec_buff = clcreatebuffer(context,cl_mem_read_only | cl_mem_copy_host_ptr,sizeof(float)*4,vec,&err);

res_buff = clcreatebuffer(context,cl_mem_read_only | cl_mem_copy_host_ptr,sizeof(float)*4,vec,&err);

clsetkernelarg(kernel,0,sizeof(cl_mem),&mat_buff);

clsetkernelarg(kernel,1,sizeof(cl_mem),&vec_buff);

clsetkernelarg(kernel,2,sizeof(cl_mem),&res_buff);

work_units_per_kernel = 4;

clenqueuendrangekernel(queue,kernel,1,null,&work_units_per_kernel,null,0,null,null);

clenqueuereadbuffer(queue,res_buff,cl_true,0,sizeof(float)*4,result,0,null,null);

if(result[0]==correct[0]&&result[1]==correct[1]&&result[2]==correct[2]&&result[3]==correct[3])else

clreleasememobject(res_buff);

clreleasememobject(vec_buff);

clreleasememobject(mat_buff);

clreleasekernel(kernel);

clreleasecommandqueue(queue);

clreleaseprogram(program);

clreleasecontext(context);

system("pause");

return 0;

}

matvec.cl

__kernel void matvec_mult(__global float4* matrix,

__global float4* vector,

__global float* result)

注意在vs下儲存.cl檔案時要把高階儲存選項選為 unicode-8 unix(lf)

OpenCL加速矩陣運算

opencl運用並行的方法加速矩陣運算,在業界得到廣泛運用,博主也試了一試,挺好玩的。注意 1 opencl針對的資料量越大,加速效果越明顯 2 opencl版本測試在nvidia730上,cuda7.5下的opencl檔案,windows7 3 opencl sdk位於c program file...

tensorflow點乘與矩陣乘

若 w 為 m 1 的矩陣,x 為 m n 的矩陣,那麼通過點乘結果就會得到乙個 mn 的矩陣。若 w 為 m n 的矩陣,x 為 m n 的矩陣,那麼通過點乘結果就會得到乙個 mn 的矩陣。w的列數只能為 1 或與x的列數相等 即n w的行數與x的行數相等 才能進行乘法運算。若 w 為 m p 的...

python矩陣點乘和叉乘 矩陣的點成和叉乘

矩陣的叉乘 a 1 0 2 1 3 1 b 3 1 2 1 1 0 c 5 1 4 2 matlab叉乘 c a b python叉乘 np.dot a,b 矩陣的點乘 對應位置上的元素相乘,要求兩個矩陣同行同列 a 1 0 1 3 b 3 1 2 1 c 3 0 2 3 matlab的點乘 c a...