OpenCL将数组从内存copy到显存
本来想对上一篇博客做优化,优化效果不明显。但知识点还是要记一下。
初衷是想把上一篇博客中定义域的计算搬到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到显存相关推荐
- 显卡内存和计算机内存,显卡爆显存和满显存有什么区别
显卡"爆显存"就是指显卡的本地显存不够用了,显卡需要去借用内存;而"满显存"是指显存的使用量接近全部的本地显存容量. 因为现在的主流显存都是GDDR5,速度达到 ...
- 大型3d游戏资源加载三步曲(硬盘-amp;gt;内存-amp;gt;显存)
做过游戏的人都知道游戏的资源非常庞大,需要有一个好的后台预加载机制.现在一般都是再开一个I/O线程,主线程有I/O需求的话,将信息推入队列,I/O辅助线程从队列读出需求,从磁盘加载I/O,加载好后设置 ...
- 如何才能使用内存小或者显存小的设备训练神经网络
每一轮就清空一次,加载新的数据集 每轮保存一次模型,每轮都加载预训练模型 或者在每次输入数据前使用 torch.cuda.empty_cache()这句话及时的清理显存 深度学习与PyTorch实战 ...
- LCD不带显存,是如何内存映射屏幕。S5PV210SoC在内存中选一段内存存放颜色数据,通过配置将LCD控制器和这一段内存连接起来,构成映射关系,LCD控制器就自动从显存中读取像素数据传给LCD驱动器
一.LCD控制原理 S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口. 类型: STN ...
- 【GPU结构与CUDA系列4】GPU存储资源:寄存器,本地内存,共享内存,缓存,显存等存储器细节
0 软件抽象和硬件结构对应关系的例子 把GPU跟一个学校对应起来,学校里有教学楼.操场.食堂,还有老师和学生们:很快有领导(CPU)来检查卫生(需要执行的任务Host程序),因此这个学校的学生们要完成 ...
- 内存和显存_小科普 |“内存”和“显存”有啥关系?
上周,我们一起了解了什么是DIMM.什么是DDR内存(戳这里),相信有不少人心里还有个疑惑:"内存与显存有什么差别?为什么显卡都GDDR6了,CPU还在用DDR4?"那么我们今天就 ...
- 计算机怎么看显卡内存容量,显存容量是什么,详细教您查看显卡容量大小方法...
最近小编发现小伙伴们向小编提出了许多的问题,例如其中就有要如何查看显卡容量的这个问题.所以小编今天就来给小伙伴们说说查看显卡容量的方法,可以让小伙伴们自己就能够查看显卡容量. 显卡容量要怎样进行查看呢 ...
- 显卡内存和计算机内存,显存和内存的关系和区别
显存和内存是什么关系?显存和内存有什么区别?接下来我们来讨论一下.通常说到显存和内存的时候,还会说一下缓存.存储,我们一起介绍一下. 1.显存 即显卡内存,也叫帧缓存,是用来存储显卡芯片处理过或者即将 ...
- 如何知道计算机显卡内存,电脑显卡是什么 怎么查显卡显存【图文】
电脑显卡是什么?相信对于大部人都懂的怎么使用电脑,却不知道电脑显卡是什么.电脑显卡是电脑关键的一部分,如果没有了电脑显卡,即使有显示频也不能显示.相信对于一些游戏玩家来说,显卡这个名词必须是很熟悉,因 ...
最新文章
- 关于批量发布blog的问题
- node --- 后端使用body-parse解析Post请求,前端使用axios发送Post请求
- HDU3183 A Magic Lamp —— 贪心(单调队列优化)/ RMQ / 线段树
- python画图颜色种类_Python可视化|matplotlib07-python colormap(颜色映射)(三)
- JSON和JavaScript对象互转
- 现在进行时和一般现在时的将来时态_39
- 当把CocoaPods生成的workspace移动到上层目录时
- 适配iOS10以及Xcode8
- easypr4android,EasyPR的基本使用
- plsql导出表结构和表数据的使用小结
- 全国计算机等级二级ACCESS数据库程序设计(更新完毕)
- python修改pdf元信息 metadata
- 办公软件 Excel考试面试题库和答案
- python语言实验——某年某月的天数 OJ1160
- 被谢耳朵一直嘲笑的MIT,这次发明了黑镜中的“恐怖机器”
- table表格宽带width属性研究
- 企业网站优化操作步骤分享
- validate.js 插件表单校验
- 【Jmeter操作步骤】
- SpringBoot:Sa-Token的具体介绍与使用