利用OpenCL对OpenCV并行化心得(1)
来源:互联网 发布:广告动画制作软件 编辑:程序博客网 时间:2024/06/03 21:04
做了一年多的opencv并行化,总算小有成就了,马上软件就要发布,也该是一个总结的时候了,只可惜文笔不行,人也懒,只好随便写写,算是给自己做点交代吧。
opencv里面最重要的一种类型恐怕非8UC1莫属,灰度图一般都用这种类型表示,而且大多数算法只提供这种数据类型的支持,所以8UC1的优化就成了整个工作的重中之重。以matrix add为例,最简单的kernel的写法是这样的
__kernel void matrix_add(__global uchar* src1,__global uchar* src2, __global uchar* dst, int rows, int cols,int src1_step,int src2_step,int dst_step)
{
int x=get_global_id(0);
int y=get_global_id(1);
if(x<cols&&y<rows)
dst[mad24(y,dst_step,x)]=src1[mad24(y,src1t_step,x)]+src2[mad24(y,src2_step,x)];
}
这种写法非常简洁,但是不够高效,没有充分利用GPU的内存带宽,存在很大的浪费,为了充分利用GPU的内存带宽,至少每次要写出4byte,所以kernel就变成这样
__kernel void matrix_add(__global uchar* src1,__global uchar* src2, __global uchar* dst, int rows, int cols,int src1_step,int src2_step,int dst_step)
{
int x=get_global_id(0)<<2;
int y=get_global_id(1);
if(x<cols&&y<rows)
*(__global ucha4*)(dst+mad24(y,dst_step,x))=*(__global ucha4*)(src1+mad24(y,src1t_step,x))+*(__global ucha4*)(src2+mad24(y,src2_step,x));
}
这样效率会提高四倍左右,但是可以这样写的前提是没有ROI问题,如果有ROI情况会复杂很多- 利用OpenCL对OpenCV并行化心得(1)
- 利用OpenCL对OpenCV并行化心得(2)
- 利用OpenCL对OpenCV并行化心得(3)
- OpenCV对OpenCL的支持
- Android平台利用OpenCL框架实现并行开发初试
- HEVC/H.265 的未来必须是使用并行处理(OpenCL?) OpenCV和OpenCL区别
- HEVC/H.265 的未来必须是使用并行处理(OpenCL?) OpenCV和OpenCL区别
- HEVC/H.265 的未来必须是使用并行处理(OpenCL?) OpenCV和OpenCL区别
- OpenCL做并行滤波
- HEVC/H.265 的未来必须是使用并行处理(OpenCL?) OpenGL和OpenCV区别
- HEVC/H.265 的未来必须是使用并行处理(OpenCL?) OpenGL和OpenCV区别
- HEVC/H.265 的未来必须是使用并行处理(OpenCL?) OpenGL和OpenCV区别
- OpenCL学习笔记(二):并行编程概念理解
- 《OpenCL异构并行计算:原理、机制与优化实践》笔记(一):OpenCL简介
- OpenCL之我心得
- OpenCL心得2
- opencl(1)
- 利用OpenCV对图像旋转
- MySQL重置root帐户密码
- C++实现trim()函数
- 接口与抽象类
- linuxmint 网卡备忘
- MSP430强大
- 利用OpenCL对OpenCV并行化心得(1)
- MFC的RTTI实现机制!
- HDU 2123 An easy problem
- 多线程的总结
- Android开发之获得通讯录及SIM卡中联系人
- 一种加快OLE导出Excel的方法
- bat
- uva 10718 - Bit Mask
- 多线程问题2