OpenCL 矩阵加法[3]

对于CL计算这里,我总是能遇见一些神奇的问题,目前我也是摸索一些解决办法,分享在这里了。强调,我是在做笔记,不是做教程

矩阵加法函数,为了能不在内存申请和释放上浪费太多时间,这里要用到的显存空间都是预先申请好的,

传入了5个参数,分别是两个要计算加法的矩阵,一个结果矩阵,和矩阵这三个矩阵的长宽,传入参数后,设置工作组大小,这里我不是很明白与什么有关,所以后面做了一些尝试,然后开始执行加法操作,最后释放参数。

void gmat::add(gmat& A, gmat& B, gmat& C)
{
	//外来数据
	cl_mem t_row = GPU.gmalloc(&A.row, 4, COPY_MEM_TO_DEVICE);
	cl_mem t_col = GPU.gmalloc(&A.col, 4, COPY_MEM_TO_DEVICE);
	//输入参数
	programs[ADD].setArgs({ &(A.data_pack->data),&(B.data_pack->data),&(C.data_pack->data),&t_row,&t_col });
	//执行代码
	size_t localWorkSize[2] = { 8,8 };
	size_t size_xy[2] = { A.row,A.col };
	GPU.run(2, programs[ADD], size_xy, localWorkSize);
	//清除参数
	programs[ADD].clearArgs();
	clReleaseMemObject(t_row);
	clReleaseMemObject(t_col);

}

对应的着色器代码,看起来挺简单的。

__kernel void main(__global float*pIn1,__global float*pIn2, __global float *pOut,__global int *row,__global int *col) 
{ 
   int i = get_global_id(0); 
   int j = get_global_id(1); 
   int index = i*(*col)+j;
   pOut[index]=pIn1[index]+pIn2[index];

} 

后面我运行了一下,和CPU计算比较了一下,矩阵大小是8192x8192,计算100次,结果如下

我觉得有一些奇怪,这是分组8x8的时候计算结果,感觉没比CPU快多少,显卡是GTX965M,CPU是4720HQ,那也不能差这么少。

当我换成分组的16x16的时候就这样了,如下图。

这回速度反倒更慢了,当我换成4x4的时候结果如下图。

这样速度也慢了,我发现在分组是8x8的时候是最快的,后来我看了一下我显卡的信息,发现了如下参数。

我怀疑可能是这个计算单元数目是8,然后把分组写成8刚好效率最高,,这只是我的猜测。目前矩阵加法实现了,感觉效果没有预期的好,往后应该研究一下差在哪里。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值