CL最新速私信怎么用

经过实验发现如果计算量不够大利用opencl反而浪费时间。所以本实验进行加速的原来代码如下:

//A,B,D初始化之后进行计算

接下来进行opencl进行加速对64个8*8的矩阵计算并行计算。
第一步:用Eigen声明矩阵并赋初值。这里就是简单地对矩阵乘法重复64次所以初始化一组矩阵就行了。

第三步:利用Map进行映射(这里相关原理在(一)中已经说明)

//Map进行映射这里默认64个相同矩阵,实际中只需通过指针移动指向相应矩阵即可

第四步:创建内存对象这一步就是OpenCL的知识了,这里假设大家已经了解OpenCL的总流程了本文重点讲解OpenCL加速矩阵计算。

// 创建输入内存对象
 // 创建输出内存对象
//这里理论上输入时64*8*8的三维輸入但是这里选择输入为64*8的两维输入,每次计算一行 double tmpAline[8];//将A矩阵的某一行先读到设备的缓存中减少数据搬移时间 //这里要特别注意一个问题 //切记opencl的设备读入数组均是按照列排序的,大家可以实验如果按照按行读入理解计算,算出来的是利用Eigen计算出来的转置 由于指针是按列排序读叺 所以假设当前是第m个矩阵 //首先先读取A的第i行数据 //然后得到A*B的第i行数据用A的第i行分别乘以B的每一列 //再计算C1第i行数据,因为这里乘以A的转置实际上就是乘以A的每一行 // 利用命令队列使将再设备上执行的内核排队 NULL, // 确定内核在设备上的多个处理单元间的分布

第八步:读取内核计算结果

CL_TRUE, // 内核读取结束之前该函数不会返回

第九步:将结果映射回矩阵,注意由于这里矩阵是按列读取的所以在内核计算的时候就考虑了,这里这样读出后就是正常的矩阵了。

第十步:利用Eigen直接计算矩阵

最后大家可以比较矩阵eigMatC1 与矩阵eigMatD1一样,同时可以比较两者时间
比较時间时虽然Opencl提供了计算内核时间的函数,但是个人感觉没有意义因为在实际应用中,需要考虑到数据搬移的时间所以建议opencl的运行时间約定为从创建设备内存对象开始一直到将读取数据copy到矩阵为止。这时计算时间就可以通过获取时间戳相减就行了建议使用chrono库,精度高一些

下载百度知道APP抢鲜体验

使用百喥知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

我要回帖

更多关于 私信怎么用 的文章

 

随机推荐