对于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刚好效率最高,,这只是我的猜测。目前矩阵加法实现了,感觉效果没有预期的好,往后应该研究一下差在哪里。