3

我想知道opencv如何对矩阵进行操作。例如,当我为

cv::add (Mat mat1, Mat mat2, Mat &result)

使用两个for loops,1000x750 图像大约需要 120-130 毫秒。但是使用 opencv add 函数需要 6-7 毫秒。有谁知道他们的伎俩是什么?我想学习它能够编写opencv没有的功能。

我在 opencv 中搜索并找到了这两个 .cpp 文件(第一个第二个),但我不知道我是否在寻找正确的位置。

我只是想知道如何使用这种力量。有人可以帮我吗?

谢谢,

4

2 回答 2

5

您提供的两个 cpp 文件用于 GPU 操作(CUDA 和 OpenCL)。根据您的问题,我认为您正在寻找非 GPU 操作,这是正确的文件。.

OpenCV 以其速度而闻名,它来自他们在代码中所做的大量优化。我只是给他们一些提示。

1、SIMD优化

这是 OpenCV 中优化的主要来源之一。几乎所有算术运算都经过 SIMD 优化。在您的情况下,SIMD 优化也是更好的选择(OpenCV 已经这样做了)。根据您的实施级别,它可以将性能提高数倍。所有现代处理器都带有内置的 SIMD 支持(SSE、AVX 等)。

与我们普通的 C++ 相比,它有点复杂。不是一次只从两个矩阵中添加两个像素,而是同时添加大约 16 个像素(这取决于数据类型)。理论上它提供了 16 倍的加速。这是我在学习 SIMD 汇编时编写的一个简单示例(您可以使用更简单的 Intrinsics)。它没有太多优化(只是为了学习而编写),仍然提供了 20 倍的加速。

同样,为了在 ARM 平台中使用,代码正在被 NEON 优化(主要由 Nvidia 团队为其 Tegra 处理器提供)。例子

2.通过TBB进行多线程

另一个重要的是 TBB 的使用,有人已经在他的回答中提到了它,你必须用 TBB 编译 OpenCV 源代码才能实现它。正如他所提到的,这可能不是一件容易的事。OpenCV 中对人脸检测等许多功能进行了 TBB 优化。

OpenCV 还做了一些其他技术,比如循环展开(示例)它提供了轻微的改进。现代编译器已经非常擅长这一点。

您可以阅读Agner Fog 的优化技术手册,了解有关优化 C++ 代码的更多详细信息。所有这些细节都是相关的。

于 2013-08-26T05:56:50.013 回答
2

In this page they say at the end of the document that it is faster because functions of the core are multi-thread enabled via Intel Threaded Building Blocks.

于 2013-08-25T14:23:36.550 回答