smt*_*tsp 3 c++ opencv function
我想知道opencv如何对矩阵进行运算。例如,当我编写代码时
cv::add (Mat mat1, Mat mat2, Mat &result)
Run Code Online (Sandbox Code Playgroud)
使用两个for loops1000x750 图像大约需要 120-130 毫秒。但使用opencv add函数需要6-7毫秒。有谁知道他们的伎俩是什么?我想学习它能够编写opencv没有的功能。
我在 opencv 内部搜索并找到这两个 .cpp 文件(第一个,第二个),但我不知道我是否正在寻找正确的位置。
我只是想知道如何使用这个力量。有人可以帮助我吗?
谢谢,
您提供的两个 cpp 文件用于 GPU 操作(CUDA 和 OpenCL)。从你的问题来看,我认为你正在寻找非 GPU 操作,这是正确的文件。。
OpenCV 以其速度而闻名,这来自于他们在代码中所做的大量优化。我只会给其中一些人一些提示。
1.SIMD优化
这是 OpenCV 优化的主要来源之一。几乎所有算术运算都经过 SIMD 优化。在你的情况下,SIMD 优化也是更好的选择(OpenCV 已经做到了)。根据您的实施级别,它可以将性能提高数倍。所有现代处理器都具有内置 SIMD 支持(SSE、AVX 等)。
与我们普通的C++相比,它有点复杂。您不是一次仅添加两个矩阵中的两个像素,而是同时添加大约 16 个像素(这取决于数据类型)。理论上它可以提供 16 倍的加速。这是我在学习 SIMD 汇编时编写的一个简单示例(您可以使用更简单的内部函数)。它没有太多优化(只是为了学习而编写),仍然提供 20 倍的加速。
同样,为了在 ARM 平台中使用,代码正在 NEON 优化(主要由 Nvidia 团队为其 Tegra 处理器贡献)。例子
2.通过TBB实现多线程
另一个重要的一个是TBB的使用,有人已经在他的回答中提到了它,你必须使用TBB编译OpenCV源才能实现它。正如他所说,这可能不是一件容易的事。OpenCV 中的许多功能(例如人脸检测等)均经过 TBB 优化。
OpenCV 还有一些其他技术,例如循环展开。(示例)它提供了轻微的改进。现代编译器已经非常擅长这一点。
您可以阅读Agner Fog 的优化技术手册,了解有关优化 C++ 代码的更多详细信息。所有这些细节都是相关的。
| 归档时间: |
|
| 查看次数: |
3095 次 |
| 最近记录: |