我想知道opencv如何对矩阵进行操作。例如,当我为
编写代码时cv::add (Mat mat1, Mat mat2, Mat &result)
使用两个for loops
,1000x750图像大约需要120-130毫秒。但是使用opencv add函数需要6-7 ms。有谁知道他们的伎俩是什么?我想学习它能够编写opencv没有的函数。
我在opencv中搜索并找到这两个.cpp文件(first,second),但我不知道我是否正在寻找正确的位置。
我只是想知道如何使用这种力量。有人能帮帮我吗?
谢谢,
答案 0 :(得分:4)
您提供的两个cpp文件用于GPU操作(CUDA和OpenCL)。从您的问题来看,我认为您正在寻找非GPU操作,这是correct file.。
OpenCV以其速度而闻名,它来自于他们在代码中进行的大量优化。我会给其中一些人提供一些提示。
<强> 1。 SIMD优化
这是OpenCV的主要优化来源之一。几乎所有算术运算都经过SIMD优化。在您的情况下,SIMD优化是更好的选择(OpenCV已经完成)。它会将性能提高几倍,具体取决于您的实施级别。所有现代处理器都带有内置的SIMD支持(SSE,AVX等)。
与普通的C ++相比,它有点复杂。不是一次只从两个矩阵中添加两个像素,而是同时添加大约16个像素(它取决于数据类型)。从理论上讲,它提供了16倍的加速。我在学习SIMD汇编时写的Here is a simple example(你可以使用更简单的内在函数)。它没有太多优化(只是为了学习而编写),仍然提供20倍的加速。
同样,对于在ARM平台中使用,代码正在进行NEON优化(主要由Nvidia Team为其Tegra处理器提供)。 Example
<强> 2。通过TBB
进行多线程处理另一个重要的是使用TBB,有人已经在他的回答中提到过它,你必须用TBB编译OpenCV源来实现它。正如他所提到的,这可能不是一件容易的事。面部检测等许多功能都是在OpenCV中进行TBB优化的。
OpenCV还做了一些其他技术,如循环展开。 (Example)它略有改进。现代编译器已经非常擅长这一点。
您可以阅读 Agner Fog's optimization techniques manuals ,了解有关优化C ++代码的更多详细信息。所有这些细节都是相关的。
答案 1 :(得分:2)
在this页面中,他们在文档末尾说它更快,因为核心功能是通过英特尔螺纹构建模块启用多线程的。