本来想对上一篇博客做优化,优化效果不明显。但知识点还是要记一下。

初衷是想把上一篇博客中定义域的计算搬到CPU来计算,因为定义域的计算对于每一个kernel都是一样的,所以直接读取应该是可以进一步减小kernel的执行时间的。

我的思路的初衷是将这块的数据送到显存之后再送到寄存器中,从寄存器读取的时间应该是很快的,通过这样把计算的时间改为读取的时间。当然,读取寄存器的时间是否比计算更短,这个确实应该质疑,但是对于比较复杂的计算,我觉得直接读应该是比计算更快的。而对于这部分数据,CPU计算应该会比GPU更快。当然,还应当考虑数据量的大小,从内存搬到显存也是需要时间的。

1.C++代码

..................int ksize = 11;
float sigma_d = 3.0;
float *dkl = new float[ksize*ksize];
for (int i = -ksize/2; i <= ksize/2; i++){for (int j = -ksize/2; j <= ksize/2; j++){dkl[(i+ksize/2)*ksize + (j+ksize/2)] = -(i*i + j*j) / (2 * sigma_d*sigma_d);}
}cl_mem d_dkl;
d_dkl = clCreateBuffer(context, CL_MEM_READ_ONLY, ksize*ksize*sizeof(float), NULL,NULL);
clEnqueueWriteBuffer(commandQueue, d_dkl, CL_TRUE, 0, ksize*ksize*sizeof(float), dkl, 0, NULL, NULL);........................errNum |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &d_dkl);
errNum |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &ksize);........................delete[] dkl;...................

主要就是clCreateBuffer函数和clEnqueueWriteBuffer函数的用法。

2.kernel代码

const sampler_t sampler = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;kernel void bilateralBlur(read_only image2d_t src, write_only image2d_t dst, __constant float* dkl, int ksize)
{int x = (int)get_global_id(0);  int y = (int)get_global_id(1);  if (x >= get_image_width(src) || y >= get_image_height(src))  return;  float sigma_d = 3.0;float sigma_r = 0.1;float4 fij = read_imagef(src, sampler, (int2)(x, y));float alpha = 0.2;float4 fkl;float4 rkl;float4 wkl;int index = 0;float4 numerator = (float4)(0.0f,0.0f,0.0f,0.0f);float4 denominator = (float4)(1.0f, 1.0f, 1.0f, 1.0f);for (int K = -ksize / 2; K <= ksize / 2; K++){for (int L = -ksize / 2; L <= ksize / 2; L++){fkl = read_imagef(src, sampler, (int2)(x + K, y + L));rkl.x = -(fij.x - fkl.x)*(fij.x - fkl.x) / (2 * sigma_r*sigma_r);rkl.y = -(fij.y - fkl.y)*(fij.y - fkl.y) / (2 * sigma_r*sigma_r);rkl.z = -(fij.z - fkl.z)*(fij.z - fkl.z) / (2 * sigma_r*sigma_r);wkl.x = exp(-dkl[index] + rkl.x);wkl.y = exp(-dkl[index] + rkl.y);wkl.z = exp(-dkl[index] + rkl.z);index++;numerator.x += fkl.x * wkl.x;numerator.y += fkl.y * wkl.y;numerator.z += fkl.z * wkl.z;denominator.x += wkl.x;denominator.y += wkl.y;denominator.z += wkl.z;}}float4 gij = (float4)(0.0f, 0.0f, 0.0f, 1.0f);if (denominator.x > 0 && denominator.y > 0 && denominator.z){gij.x = numerator.x / denominator.x;gij.y = numerator.y / denominator.y;gij.z = numerator.z / denominator.z;gij.x = fij.x*alpha + gij.x*(1.0 - alpha);gij.y = fij.y*alpha + gij.y*(1.0 - alpha);gij.z = fij.z*alpha + gij.z*(1.0 - alpha);}write_imagef(dst, (int2)(x, y), gij);
}

与上一博客的代码相比,主要就是把dkl的计算改为了读取,ksize也通过参数传进来。

3.结果

与上一篇3.42ms相比,有零点几毫秒的优化。不过考虑CPU的计算,优化应该更小,或者没有,或者稍差。

当然,我这里的计算简单,对于复杂的计算,应该还是可以考虑这种优化方法的。

下一步考虑内存优化,增大粒度。

代码:http://download.csdn.net/download/qq_33892166/9771206

转载于:https://www.cnblogs.com/betterwgo/p/6506844.html

OpenCL将数组从内存copy到显存相关推荐

  1. 显卡内存和计算机内存,显卡爆显存和满显存有什么区别

    显卡"爆显存"就是指显卡的本地显存不够用了,显卡需要去借用内存;而"满显存"是指显存的使用量接近全部的本地显存容量. 因为现在的主流显存都是GDDR5,速度达到 ...

  2. 大型3d游戏资源加载三步曲(硬盘-amp;gt;内存-amp;gt;显存)

    做过游戏的人都知道游戏的资源非常庞大,需要有一个好的后台预加载机制.现在一般都是再开一个I/O线程,主线程有I/O需求的话,将信息推入队列,I/O辅助线程从队列读出需求,从磁盘加载I/O,加载好后设置 ...

  3. 如何才能使用内存小或者显存小的设备训练神经网络

    每一轮就清空一次,加载新的数据集 每轮保存一次模型,每轮都加载预训练模型 或者在每次输入数据前使用 torch.cuda.empty_cache()这句话及时的清理显存 深度学习与PyTorch实战 ...

  4. LCD不带显存,是如何内存映射屏幕。S5PV210SoC在内存中选一段内存存放颜色数据,通过配置将LCD控制器和这一段内存连接起来,构成映射关系,LCD控制器就自动从显存中读取像素数据传给LCD驱动器

    一.LCD控制原理 S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口. 类型: STN ...

  5. 【GPU结构与CUDA系列4】GPU存储资源:寄存器,本地内存,共享内存,缓存,显存等存储器细节

    0 软件抽象和硬件结构对应关系的例子 把GPU跟一个学校对应起来,学校里有教学楼.操场.食堂,还有老师和学生们:很快有领导(CPU)来检查卫生(需要执行的任务Host程序),因此这个学校的学生们要完成 ...

  6. 内存和显存_小科普 |“内存”和“显存”有啥关系?

    上周,我们一起了解了什么是DIMM.什么是DDR内存(戳这里),相信有不少人心里还有个疑惑:"内存与显存有什么差别?为什么显卡都GDDR6了,CPU还在用DDR4?"那么我们今天就 ...

  7. 计算机怎么看显卡内存容量,显存容量是什么,详细教您查看显卡容量大小方法...

    最近小编发现小伙伴们向小编提出了许多的问题,例如其中就有要如何查看显卡容量的这个问题.所以小编今天就来给小伙伴们说说查看显卡容量的方法,可以让小伙伴们自己就能够查看显卡容量. 显卡容量要怎样进行查看呢 ...

  8. 显卡内存和计算机内存,显存和内存的关系和区别

    显存和内存是什么关系?显存和内存有什么区别?接下来我们来讨论一下.通常说到显存和内存的时候,还会说一下缓存.存储,我们一起介绍一下. 1.显存 即显卡内存,也叫帧缓存,是用来存储显卡芯片处理过或者即将 ...

  9. 如何知道计算机显卡内存,电脑显卡是什么 怎么查显卡显存【图文】

    电脑显卡是什么?相信对于大部人都懂的怎么使用电脑,却不知道电脑显卡是什么.电脑显卡是电脑关键的一部分,如果没有了电脑显卡,即使有显示频也不能显示.相信对于一些游戏玩家来说,显卡这个名词必须是很熟悉,因 ...

最新文章

  1. 关于批量发布blog的问题
  2. node --- 后端使用body-parse解析Post请求,前端使用axios发送Post请求
  3. HDU3183 A Magic Lamp —— 贪心(单调队列优化)/ RMQ / 线段树
  4. python画图颜色种类_Python可视化|matplotlib07-python colormap(颜色映射)(三)
  5. JSON和JavaScript对象互转
  6. 现在进行时和一般现在时的将来时态_39
  7. 当把CocoaPods生成的workspace移动到上层目录时
  8. 适配iOS10以及Xcode8
  9. easypr4android,EasyPR的基本使用
  10. plsql导出表结构和表数据的使用小结
  11. 全国计算机等级二级ACCESS数据库程序设计(更新完毕)
  12. python修改pdf元信息 metadata
  13. 办公软件 Excel考试面试题库和答案
  14. python语言实验——某年某月的天数 OJ1160
  15. 被谢耳朵一直嘲笑的MIT,这次发明了黑镜中的“恐怖机器”
  16. table表格宽带width属性研究
  17. 企业网站优化操作步骤分享
  18. validate.js 插件表单校验
  19. 【Jmeter操作步骤】
  20. SpringBoot:Sa-Token的具体介绍与使用

热门文章

  1. 请律师到底有什么用?
  2. 一切问题的解决都离不开人
  3. 1000个网络摄像头如何组网?
  4. 华为手机系统更新后有什么大的变化?
  5. OpenCV之图像的混合
  6. vim学习笔记--代码折叠
  7. ubuntu 15.04安装VMware11
  8. ssis 创建ssisdb_使用SSIS创建备份
  9. css 引入的 方式有哪些? link与post有什么区别??
  10. 枚举编写单例是可以保证在多线程中的安全性