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...