一、概述
很多人觉得OpenCV速度比较慢,其实提升OpenCV运行速度,最常见的就是重新编译OpenCV,添加各种指令集优化支持。
SIMD(Single Instruction Multiple Data ),顾名思义,就是单条指令处理多个数据。比如我们处理BYTE类型的乘法,也是需要32位寄存器来做处理.这样显得有些浪费.实际上我们可以把乘数合并,一次32位的乘法得到两个乘法结果.示例代码如下:
R1 = a1*b;
R2 = a2*b;
转换成
T1 = (a1 | (a2 <<16))*b;
R1 = T1&0xffff;
R2 = T1>>16;
在游戏/多媒体等典型的图形处理应用中,我们经常需要对连续密集的数据进行处理.这正是SIMD长处.
SIMD(Single Instruction Multiple Data)指令集,这个古老的东西,从第一代开始算起,也快有近20年的历史了,从最开始的MMX技术,到SSE,以及后来的SSE2、SSE3、SSE4、AVX以及11年以后的AVX2,逐渐的成熟和丰富,不过目前考虑通用性方面,AVX的辐射范围还是有限,大部分在优化时还是考虑使用128位的SSE指令集。
SIMD指令集,指单指令多数据流技术,可用一组指令对多组数据通进行并行操作。SIMD指令可以在一个控制器上控制同时多个平行的处理微元,一次指令运算执行多个数据流,这样在很多时候可以提高程序的运算速度。
SIMD指令在本质上非常类似一个向量处理器,可对控制器上的一组数据(又称“数据向量”) 同时分别执行相同的操作从而实现空间上的并行。SIMD是CPU实现DLP(Data Level Parallelism)的关键,DLP就是按照SIMD模式完成计算的。SSE和较早的MMX和 AMD的3DNow!都是SIMD指令集。它可以通过单指令多数据技术和单时钟周期并行处理多个浮点来有效地提高浮点运算速度。
在CMake阶段:
启用SSE指令集,SSE3/SSE4,AVX/AVX2
勾选支持 ENABLE_AVX ENABLE_AVX2 ENABLE_POPCNT
勾选 TBB支持
如果有英伟达显卡,勾选 CUDA相关选项
代码实现阶段:
1. 多用指针
2. 框架 parallel_for_ 编程,支持OpenMP、pthreads、C++11 threads、Intel TBB、Microsoft并发或GCD等在不同系统上。
3. 多看OpenCV源码,实现SSE编程重写
4. CUDA编程实现
上述主要针对传统的图像处理模块! 对深度神经网络-DNN模块,OpenCV支持OpenVINO加速执行是一个很好的选择。
总结,基本上OpenCV通过上述手段加速,特别是并行对卷积操作特别有效,常规的3D卷积加速可以达到300倍左右!CUDA对传统的图像处理可以达到30~100之间,可以说基本上让OpenCV性能速度可以达到工业级应用要求!
OpenCV加速与优化,让代码执行速度飞起来https://cloud.tencent.com/developer/article/1536447
开源simd库:
Simd Libraryhttp://ermig1979.github.io/Simd/https://github.com/ermig1979/Simd
https://github.com/ermig1979/Simd
Simd库是一个免费的开源图像处理库-开源_simd库-其它代码类资源-CSDN下载Simd库是一个免费的开源图像处理库,专为C和C++程序员设计。它为图像处理提供了许多有用的高性simd库更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_38697808/16647075使用SIMD的C++图像处理和机器学习库:SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX(Altivec)和VSX(Power7),NEONforARM。-C/C++开发_-互联网文档类资源-CSDN下载使用SIMD的C++图像处理和机器学习库:SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX(Altivec)和VSX(Power7),NEONforARM。-C/C++开发,使用SIMD的C++图像处理库:SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX(Altivec)和VSX(Power7),NEONforARM。简介Simd库是一个免费的开源图像处理和机器学习库,专为C和C++程序员设计。它为图像处理提供了许多有用的高性能算法,例如:像素格式转换,图像缩放和过滤,从图像中提取统计信息,运动检测,对象检测(HAAR和LBP分类器级联)和分类,神经网络。通过使用不同的SIMDCPU扩展来优化算法。更多下载资源、学习资料请访问CSDN下载频道
https://download.csdn.net/download/weixin_42105169/19102541pixel:C和SIMD进行图像处理,有时比OpenCV更快-源码_-互联网文档类资源-CSDN下载pixel:C和SIMD进行图像处理,有时比OpenCV更快-源码,像素点此回购包含一些有关基本图像处理的单独程序。它主要是出于个人学习的目的,我将继续编写它们的朴素(纯C)和SIMD(ARMNEON,SSE)优化版本。随时为该回购创建问题/观看/提出拉取请求。更多下载资源、学习资料请访问CSDN下载频道
https://download.csdn.net/download/weixin_42130889/15821968
二、SIMD指令集SSE/AVX
使用软件CPU-Z可以查看电脑CPU支持哪些指令集
使用Intrinsics函数操作SIMD指令集——头文件查找表
头文件 指令集描述
intrin.h All Architectures
mmintrin.h MMX
xmmintrin.h SSE
emmintrin.h SSE2
pmmintrin.h SSE3
smmintrin.h SSE4.1
nmmintrin.h SSE4.2
immintrin.h AVX
更多详细的指令集参见Intel官网:
Intel® Intrinsics Guidehttps://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html
1、精华文章
2、应用案例
单线程、SSE、AVX运行效率对比——加法运算_samylee的博客-CSDN博客_avx加速使用Intrinsics函数操作SIMD指令集——头文件查找表头文件指令集描述intrin.hAll Architecturesmmintrin.hMMXxmmintrin.hSSEemmintrin.hSSE2pmmintrin.hSSE3smmintrin.hSSE4.1nmmintrin.h...https://blog.csdn.net/samylee/article/details/88874899单线程、SSE、AVX运行效率对比——最大值/最小值运算_samylee的博客-CSDN博客_avx和sse前言单列数组下,AVX比SSE稍慢!math_function.h#pragma once#include <immintrin.h>#include <stdio.h>float MathMax(const float *input, int size);float SSEMax(const float *input, int size);fl...
https://blog.csdn.net/samylee/article/details/88948513单线程、SSE、AVX运行效率对比——乘法累加运算_samylee的博客-CSDN博客__mm256_fmadd_ps前言_mm_fmadd_ps执行效率比_mm_mul_ps +_mm_add_ps快!同样_mm256_fmadd_ps也是如此!math_function.h#pragma once#include <immintrin.h>#include <stdio.h>float MathMulAdd(const float *input1, con...
https://blog.csdn.net/samylee/article/details/88944554效率对比:分别用 C++Amp,C++ PPL,SSE/AVX,Serial(串行)计算矩阵乘法。_carlclouder的博客-CSDN博客本次测试矩阵乘法未作分块优化。未使用cuda测试。采用微妙级的计时器。分别对16阶方矩阵到4048阶方阵采用如下方式做乘法计算,统计结果。C++Amp(GPU),C++PPL(多线程16核),SSE/AVX(单线程),AVX-Db(单线程,双精度),Serial(单线程串行)时间统计如下(单位:秒)Rank :16326412825651210...
https://blog.csdn.net/carlclouder/article/details/104281311源码分享:C++矩阵类CLMatrixT,功能强大使用简单,支持内存池、宽指令、并行化加速!持续更新..._carlclouder的博客-CSDN博客C++矩阵类模板CLMatrixT:C++矩阵类模板CLMatrixT介绍:特点先演示使用方法:再看运行测试结果:最后分享源代码:C++矩阵类模板CLMatrixT介绍:最近在研究AI和深度学习,矩阵计算代码基本全是python的,C++基本没有成熟的库。而矩阵计算中,许多python的矩阵计算例子用法都很简单,感觉C++也应该有属于自己的矩阵处理类,即可享受C++的速度又可享受面向对象编程方...
https://blog.csdn.net/carlclouder/article/details/104099941
三、SIMD指令集(MMX和SSE)实现的opencv算子加速
[03] 图像算法优化 - 随笔分类 - Imageshop - 博客园https://www.cnblogs.com/Imageshop/category/334067.html
SSE图像算法优化系列一:一段BGR2Y的SIMD代码解析。https://www.cnblogs.com/Imageshop/p/6261719.html
SSE图像算法优化系列七:基于SSE实现的极速的矩形核腐蚀和膨胀(最大值和最小值)算法。https://www.cnblogs.com/Imageshop/p/7018510.html
SSE图像算法优化系列九:灵活运用SIMD指令16倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由480ms降低到30ms)。 - Imageshop - 博客园这半年多时间,基本都在折腾一些基本的优化,有很多都是十几年前的技术了,从随大流的角度来考虑,研究这些东西在很多人看来是浪费时间了,即不能赚钱,也对工作能力提升无啥帮助。可我觉得人类所谓的幸福,可以分为https://www.cnblogs.com/Imageshop/p/7285564.htmlSSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍) - Imageshop - 博客园再次触发灵感,终于将懒惰算法的图像模糊算法使用了SIMD指令集实现,速度比opencv的cvSmooth函数快近5倍,在一台老旧的I3笔记本上处理3000*2000的灰度图达到了6ms的速度,本文分享
https://www.cnblogs.com/Imageshop/p/8302990.html【算法随记一】Canny边缘检测算法实现和优化分析。 - Imageshop - 博客园经典的Canny边缘检测算法实现过程中部分细节的描述,开发记录等。
https://www.cnblogs.com/Imageshop/p/10664478.html用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。 - Imageshop - 博客园图像处理中,有很多算法由于其内在的复杂性是天然的耗时大户,加之图像本身蕴涵的数据量比一般的对象就大,因此,针对这类算法,执行速度的提在很大程度上依赖于硬件的性能,现在流行的CPU都是至少2核的,稍微好
https://www.cnblogs.com/Imageshop/p/3344103.html
四、MIPP
1、MIPP是什么?
MIPP 是用 C++11 编写的向量内在函数 (SIMD) 的可移植和开源包装器(MIT 许可)。 它适用于 SSE、AVX、AVX-512 和 ARM NEON(32 位和 64 位)指令。 MIPP 包装器支持简单/双精度浮点数以及有符号整数运算(64 位、32 位、16 位和 8 位)。
使用 MIPP 包装器,您不再需要编写特定的内部代码。 只需使用提供的函数,包装器就会自动为您的特定架构生成正确的内部调用。
x、参考文献
《并行编程方法与优化实践》,刘文志