opencv3.0调opencl计算的问题

xmzzp 2015-06-04 06:08:12

用opencv3.0做简单的人脸检测和滤波时,发现用MAt和UMat计算的时间时一样的,是Opencl没启动吗,如何判断我的设备上有没有可用的Opencl runtime及兼容设备?
...全文
2612 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我个人觉得只能酌情使用吧。。。看自己的代码是否适合,不然会适得其反。
KayChanGeek 2017-12-20
  • 打赏
  • 举报
回复
引用 18 楼 wd1603926823 的回复:
不是,因为使用OpenCV-OCL时OpenCV内部会去寻找OpenCL平台设备等创建buffer数据传输执行内部已经写好的kernel再返回,虽然kernel部分比OpenCV纯API快,但那些OpenCL的隐式初始化工作耗时太多,所以掩盖了。当我执行一张图片或者循环执行几次时(纯OpenCV只要19ms左右,而OpenCV-OCL需要400ms左右),都是纯OpenCV的API占优势;但当我循环2000次时,OpenCV-OCL(1000ms左右)就比纯OpenCV(2000ms左右)快了50%!因为这2000次都只用初始化一次。。。所以感觉OpenCV-OCL的优势不怎么大啊?不是每个项目都有这么多循环,也许某个项目中,只有几个OpenCV的API有自己的OpenCV-OCL形式,我为了加速,将这几个API改成相应的OpenCV-OCL形式,会很慢。。。因为照实验看来,只有当大幅度使用OpenCV-OCL时才有性能提升,否则适得其反。而一个项目代码中,即使都是OpenCV-API,但并不是每个API都有OCL版本,这样混着用其实性能反而降低的。所以感觉OpenCV-OCL并没有那么实用,只是人们自我安慰的幻想?
你好,我也遇到和你一样的问题,使用UMat反而速度更慢,请问你的解决了吗,大概怎么解决的?跪求大佬解惑???谢谢!
  • 打赏
  • 举报
回复
不是,因为使用OpenCV-OCL时OpenCV内部会去寻找OpenCL平台设备等创建buffer数据传输执行内部已经写好的kernel再返回,虽然kernel部分比OpenCV纯API快,但那些OpenCL的隐式初始化工作耗时太多,所以掩盖了。当我执行一张图片或者循环执行几次时(纯OpenCV只要19ms左右,而OpenCV-OCL需要400ms左右),都是纯OpenCV的API占优势;但当我循环2000次时,OpenCV-OCL(1000ms左右)就比纯OpenCV(2000ms左右)快了50%!因为这2000次都只用初始化一次。。。所以感觉OpenCV-OCL的优势不怎么大啊?不是每个项目都有这么多循环,也许某个项目中,只有几个OpenCV的API有自己的OpenCV-OCL形式,我为了加速,将这几个API改成相应的OpenCV-OCL形式,会很慢。。。因为照实验看来,只有当大幅度使用OpenCV-OCL时才有性能提升,否则适得其反。而一个项目代码中,即使都是OpenCV-API,但并不是每个API都有OCL版本,这样混着用其实性能反而降低的。所以感觉OpenCV-OCL并没有那么实用,只是人们自我安慰的幻想?
shiter 2017-11-26
  • 打赏
  • 举报
回复
引用 16 楼 wd1603926823 的回复:
我使用的是OpenCV3.2,使用OpenCV-OCL版本的比单纯使用OpenCV的慢了很多!是不是3.x都不能使用OpenCL?!只能用OpenCV2.X?
具体得去看看官方文档啦,一定是使用方式不对
  • 打赏
  • 举报
回复
我使用的是OpenCV3.2,使用OpenCV-OCL版本的比单纯使用OpenCV的慢了很多!是不是3.x都不能使用OpenCL?!只能用OpenCV2.X?
umbraclet16 2017-04-26
  • 打赏
  • 举报
回复
opencv 3.0的reference manual里删除了所有opencl的内容,估计是用不了了。。
wujushan 2017-04-20
  • 打赏
  • 举报
回复
遇到同样的问题,大家有什么解决方法吗?求分享一下,多谢
qq_35024154 2017-04-06
  • 打赏
  • 举报
回复
同求解决方法,我也遇见一样的问题; 如果有解决了得朋友希望不吝赐教哈。 感谢。 我也在研究中。 交流QQ: 411506656
BalaJoa 2016-05-11
  • 打赏
  • 举报
回复
你好,你是怎么解决的?我用opencv3.1,加了setUseOpenCL(true),但是时间就是没变。
BalaJoa 2016-05-11
  • 打赏
  • 举报
回复
你好,你是怎么解决的?我用opemcv3.1,加了setUseOpenCL(true),但是时间就是没变。
xmzzp 2015-06-08
  • 打赏
  • 举报
回复
引用 6 楼 wangyaninglm 的回复:
[quote=引用 5 楼 wangyaninglm 的回复:] 只要把dll跟lib的目录配置正确可以直接用的吧,opencl非常好用,感觉opencv支持的不错 cuda他妈的就得重新编译了,还得附加其他一大堆乱起八糟的东西,编译一次好几个小时
只要你工程包含对了,device加载正确好像项目下面就会出现红线的这种文件,似乎就是好的[/quote] 你好,我用2.4版本的时候,运行正常,也可以生成.clb文件。但是用3.0版本的时候,运行完并没有生成这个文件,是不是没启用GPU?
shiter 2015-06-08
  • 打赏
  • 举报
回复
引用 9 楼 xmzzp 的回复:
[quote=引用 8 楼 wangyaninglm 的回复:] [quote=引用 7 楼 xmzzp 的回复:] [quote=引用 6 楼 wangyaninglm 的回复:] [quote=引用 5 楼 wangyaninglm 的回复:] 只要把dll跟lib的目录配置正确可以直接用的吧,opencl非常好用,感觉opencv支持的不错 cuda他妈的就得重新编译了,还得附加其他一大堆乱起八糟的东西,编译一次好几个小时
只要你工程包含对了,device加载正确好像项目下面就会出现红线的这种文件,似乎就是好的[/quote] 你好,我用2.4版本的时候,运行正常,也可以生成.clb文件。但是用3.0版本的时候,运行完并没有生成这个文件,是不是没启用GPU?[/quote] 3.0你看文档吧,我没用过3.0,你钻研一下,看看是啥情况,发上来共同学习一下 据说3.0整体对cuda支持非常好[/quote] 谢啦,3.0对CUDA支持了更多功能,还做了一个封装[/quote] 如果想用这些特性的话,还是要重新编译的吧
xmzzp 2015-06-08
  • 打赏
  • 举报
回复
引用 8 楼 wangyaninglm 的回复:
[quote=引用 7 楼 xmzzp 的回复:] [quote=引用 6 楼 wangyaninglm 的回复:] [quote=引用 5 楼 wangyaninglm 的回复:] 只要把dll跟lib的目录配置正确可以直接用的吧,opencl非常好用,感觉opencv支持的不错 cuda他妈的就得重新编译了,还得附加其他一大堆乱起八糟的东西,编译一次好几个小时
只要你工程包含对了,device加载正确好像项目下面就会出现红线的这种文件,似乎就是好的[/quote] 你好,我用2.4版本的时候,运行正常,也可以生成.clb文件。但是用3.0版本的时候,运行完并没有生成这个文件,是不是没启用GPU?[/quote] 3.0你看文档吧,我没用过3.0,你钻研一下,看看是啥情况,发上来共同学习一下 据说3.0整体对cuda支持非常好[/quote] 谢啦,3.0对CUDA支持了更多功能,还做了一个封装
shiter 2015-06-08
  • 打赏
  • 举报
回复
引用 7 楼 xmzzp 的回复:
[quote=引用 6 楼 wangyaninglm 的回复:] [quote=引用 5 楼 wangyaninglm 的回复:] 只要把dll跟lib的目录配置正确可以直接用的吧,opencl非常好用,感觉opencv支持的不错 cuda他妈的就得重新编译了,还得附加其他一大堆乱起八糟的东西,编译一次好几个小时
只要你工程包含对了,device加载正确好像项目下面就会出现红线的这种文件,似乎就是好的[/quote] 你好,我用2.4版本的时候,运行正常,也可以生成.clb文件。但是用3.0版本的时候,运行完并没有生成这个文件,是不是没启用GPU?[/quote] 3.0你看文档吧,我没用过3.0,你钻研一下,看看是啥情况,发上来共同学习一下 据说3.0整体对cuda支持非常好
shiter 2015-06-07
  • 打赏
  • 举报
回复
引用 5 楼 wangyaninglm 的回复:
只要把dll跟lib的目录配置正确可以直接用的吧,opencl非常好用,感觉opencv支持的不错 cuda他妈的就得重新编译了,还得附加其他一大堆乱起八糟的东西,编译一次好几个小时
只要你工程包含对了,device加载正确好像项目下面就会出现红线的这种文件,似乎就是好的
shiter 2015-06-07
  • 打赏
  • 举报
回复
只要把dll跟lib的目录配置正确可以直接用的吧,opencl非常好用,感觉opencv支持的不错 cuda他妈的就得重新编译了,还得附加其他一大堆乱起八糟的东西,编译一次好几个小时
shiter 2015-06-07
  • 打赏
  • 举报
回复
xmzzp 2015-06-05
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
好像要定义一些什么宏吧?
我查了一下opencl设备设置的函数,只找到setUseOpenCL和Device类里面的set()函数,但是设置完用UMat的时间也没变。 今天还用2.4.8调了一下OpenCL,的确是快了不少,说明我电脑上设备是支持的,只是用3.0的时候没启动计算。 你如果方便的话,给我说一下具体需要定义什么东西才能启动设备。不胜感激。 以下是我设置设备的代码, cv::ocl::getPlatfomsInfo(platforms); //Access to Platform const cv::ocl::PlatformInfo* platform = &platforms[0]; //Platform Name std::cout << "Platform Name : " << platform->name().c_str() << "\n"; //Access Device within Platform cv::ocl::Device current_device; platform->getDevice(current_device, 0); cout<<"Device:"<<current_device.name()<<endl; current_device.set(0); ocl::setUseOpenCL(true);
xmzzp 2015-06-05
  • 打赏
  • 举报
回复
我查了一下opencl设备设置的函数,只找到setUseOpenCL和Device类里面的set()函数,但是设置完用UMat的时间也没变。 今天还用2.4.8调了一下OpenCL,的确是快了不少,说明我电脑上设备是支持的,只是用3.0的时候没启动计算。 你如果方便的话,给我说一下具体需要定义什么东西才能启动设备。不胜感激。 以下是我设置设备的代码, cv::ocl::getPlatfomsInfo(platforms); //Access to Platform const cv::ocl::PlatformInfo* platform = &platforms[0]; //Platform Name std::cout << "Platform Name : " << platform->name().c_str() << "\n"; //Access Device within Platform cv::ocl::Device current_device; platform->getDevice(current_device, 0); cout<<"Device:"<<current_device.name()<<endl; current_device.set(0); ocl::setUseOpenCL(true);
worldy 2015-06-04
  • 打赏
  • 举报
回复
好像要定义一些什么宏吧?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧