绝对TAPI初学者在这里。我最近移植了我的CV代码,以便使用UMat而不是Mat,因为我的CPU处于极限状态,特别是形态操作似乎消耗了相当多的计算能力。
现在使用UMat我无法看到我的帧速率发生任何变化,无论我是否使用UMat,它都完全相同,Process Explorer也不会报告任何GPU使用情况。我做了一个小小的测试,有几个扩张的呼叫和关闭全高清图像 - 没有效果。
我在这里遗漏了什么吗?我使用适用于Windows的最新OpenCV 3.2版本和使用驱动程序378.49的GTX 980。 compile ('com.facebook.android:facebook-android-sdk:4.0.0'){
exclude group: 'com.parse.bolts',
module: 'bolts-tasks'
exclude group: 'com.parse.bolts',
module: 'bolts-applinks';}
和cv::ocl::haveOpenCL()
返回cv::ocl::useOpenCL()
和true
也给了我正确的设备,据我所知,一切看起来都很好。此外,我通过cv::ocl::Context::getDefault().device( 0 )
使用了一些自定义的CL代码,这些代码肯定会被调用。
我意识到这是一种天真的思维方式,只需将Mat改为UMat就可以获得巨大的性能提升(尽管我在网上找到的所有非常有限数量的资源包括TAPI都表明了这一点)。尽管如此,我还是希望为初学者获得一些的收益,然后从那里逐步进一步优化。但是,我无法发现任何GPU使用情况,这一事实让我很恼火。
有什么我需要注意的吗?也许我对TAPI的使用阻止了简化的OpenCL代码执行,可能是我不知道的偶然/隐藏的回读?你有没有看到任何关于这个问题的分析代码的方法?
使用TAPI是否有任何操作方法,最佳做法或常见缺陷?类似的事情"不要在功能中使用本地UMat实例","使用cv::ocl::Kernel
代替getUMat()
","避免调用函数x,因为它会导致copyTo()
",那种东西?
OpenCV操作是否尚未移植到OpenCL?有相应的文件吗?在OpenCV源代码中,我看到,如果用cv::ocl::flush()
平面构建,函数尝试使用HAVE_OPENCL
宏运行CL代码,但是事先检查了一些条件,否则它会回退到CPU 。看起来我没有任何可能性来确定GPU或CPU是否真的被用于与调试器一起进入每个OpenCL功能,我是对的吗?
除此之外的任何想法/经验?我很欣赏与此事有关的任何意见。