一、概述

很多人觉得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/Simdhttps://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、精华文章

一文读懂SIMD指令集 目前最全SSE/AVX介绍_rqX的博客-CSDN博客_simd指令集https://blog.csdn.net/qq_32916805/article/details/117637192

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

基于AVX256指令集和多线程优化的双机计算加速程序_Echoooooh的博客-CSDN博客_avx 多线程任务背景大三上学期的课程设计任务。大概是要做一个计算加速的模型,通过将计算任务分配给两台计算机来进行计算加速,在其中的每一台计算机上再通过并行运算指令集和多线程加速,尽可能的获得高的加速比。共同作者@Chelsea_n老师给出的大作业要求利用相关C++需要和加速(sse,多线程)手段,以及通讯技术(1.rpc,命名管道,2.http,socket)等实现函数(浮点数数组求和,求最大值,排序)。处理在两台计算机协作执行,尽可能挖掘两个计算机的潜在算力。计算任务1280万浮点数进行求和、求最大值https://blog.csdn.net/qq_44319285/article/details/113307715

三、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

GitHub - komrad36/RGB2Y: Fastest CPU (AVX/SSE) RGB to grayscale: 2-4x faster than OpenCV. For image processing/computer vision.Fastest CPU (AVX/SSE) RGB to grayscale: 2-4x faster than OpenCV. For image processing/computer vision. - GitHub - komrad36/RGB2Y: Fastest CPU (AVX/SSE) RGB to grayscale: 2-4x faster than OpenCV. For image processing/computer vision.https://github.com/komrad36/RGB2Y

SSE图像算法优化系列四:图像转置的SSE优化(支持8位、24位、32位),提速4-6倍 - Imageshop - 博客园转置操作在很多算法上都有着广泛的应用,在数学上矩阵转置更有着特殊的意义。在图像处理上,某些情况下,转置也能有效的提高算法效率,比如很多行列可分离的算法,在很多情况下,行和列方向的算法逻辑随相同,但是由https://www.cnblogs.com/Imageshop/p/6796485.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 包装器,您不再需要编写特定的内部代码。 只需使用提供的函数,包装器就会自动为您的特定架构生成正确的内部调用。

GitHub - aff3ct/MIPP: MIPP is a portable wrapper for SIMD instructions written in C++11. It supports NEON, SSE, AVX and AVX-512.MIPP is a portable wrapper for SIMD instructions written in C++11. It supports NEON, SSE, AVX and AVX-512. - GitHub - aff3ct/MIPP: MIPP is a portable wrapper for SIMD instructions written in C++11. It supports NEON, SSE, AVX and AVX-512.https://github.com/aff3ct/MIPP2、MIPP的应用案例 --- line2Dup项目

GitHub - meiqua/shape_based_matching: try to implement halcon shape based matching, refer to machine vision algorithms and applications, page 317 3.11.5, written by halcon engineerstry to implement halcon shape based matching, refer to machine vision algorithms and applications, page 317 3.11.5, written by halcon engineers - GitHub - meiqua/shape_based_matching: try to implement halcon shape based matching, refer to machine vision algorithms and applications, page 317 3.11.5, written by halcon engineershttps://github.com/meiqua/shape_based_matching

x、参考文献

《并行编程方法与优化实践》,刘文志

OpenCV算法加速(2)使用SIMD指令集(MMX、SSE、AVX)和MIPP实现视觉算法优化相关推荐

  1. SIMD(MMX/SSE/AVX)变量命名规范心得

    [转载]:SIMD(MMX/SSE/AVX)变量命名规范心得 当使用Intrinsics函数来操作SIMD指令集(MMX/SSE/AVX等)时,会面对不同长度的SIMD数据类型,其中又分为多种紧缩格式 ...

  2. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(1) - 概述 传输指令

    MMX™ Instructions IA-32架构引入了4个指令集扩展,使得IA-32处理器可以执行单指令多数据SIMD操作.这些扩展包括MMX技术,SSE扩展,SSE2扩展,SSE3扩展. MMX指 ...

  3. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(3) - 组合的算术指令

    MMX Packed Arithmetic Instructions MMX组合的算术指令执行整型算术操作,操作数可以是组合的字节,单字,双字整型数. 指令 描述 PADDB 组合的字节整数加法 PA ...

  4. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(2) - 数据转换指令

    MMX Conversion Instructions MMX转换指令组合或拆分字节,单字,和双字. 指令 描述 PACKSSWB 格式:PACKSSWB mm1, mm2/m64 将mm1与mm2/ ...

  5. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(7) - 状态清除指令 小结

    MMX State Management Instructions EMMS指令清除MMX寄存器中的MMX状态. 指令 描述 EMMS 清除MMX状态,即x87浮点单元的tag word设置为空. 操 ...

  6. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(6) - 移位与循环移位指令

    MMX Shift and Rotate Instructions MMX移位与循环移位指令对组合的单字,双字或四字做移位/循环移位操作. 指令 描述 PSLLW 组合的单字逻辑左移 PSLLD 组合 ...

  7. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(5) - 逻辑指令

    MMX Logical Instructions 逻辑指令对64位操作数做按位逻辑操作,包括与,与非,或,异或运算. 指令 描述 PAND 按位逻辑与操作 PANDN 按位逻辑与非操作 POR 按位逻 ...

  8. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(4) - 比较指令

    MMX Comparison Instructions 指令 描述 PCMPEQB 组合的字节整型数,比较是否相等(相等置FF,不相等置00H),参看下图 PCMPEQW 组合的单字整型数,比较是否相 ...

  9. SIMD 编程的优势与SIMD指令:SSE/AVX 与编程demo

    资源:https://download.csdn.net/download/Rong_Toa/18745608 <Benefits of SIMD Programming | SIMD的优势&g ...

最新文章

  1. 【POJ】1026.Cipher
  2. python【蓝桥杯vip练习题库】ADV-356字符串的操作
  3. LRU的理解与Java实现
  4. linux ubuntu kill指令和killall指令的区别(killall会终止所有与该名字匹配的进程)
  5. 【CCS2018】SDN跨应用中毒攻击
  6. oracle如何查看实例用户,oracle 如何显示当前执行的用户和操作实例
  7. 膝关节疾病时的股四头肌锻炼法及注意事项(图示)
  8. iOS 利用UIPresentationController自定义转场动画
  9. PS动感映像插件ImageMotion 1.3中文汉化版
  10. 万字详解 GoF 23 种设计模式(多图、思维导图、模式对比),让你一文全面理解
  11. Q9.1 Ruan upp a staircase
  12. 易企秀H5 json配置文件解密分析
  13. Anyka云平台调用api
  14. 干货 | 电子设备散热技术详解
  15. 用python从身份证中提取生日信息(切片计算)
  16. Linux显示瞬间进程动态的命令ps
  17. 不完全免疫算法简介AIMA--AIS学习笔记7
  18. method属性值为get提交表单信息,为什么在地址栏不会显示呢。
  19. flash download failed 问题解决
  20. 简述SpringMVC及其工作流程图

热门文章

  1. 立秋至,暑难消,e安在线信息安全快讯
  2. Dell服务器出错代码和含义
  3. 2021 电子书搜索网站/工具,找电子书不再愁
  4. 实验1:用户的登录与退出、IO重定向与简单文件操作
  5. 环境化学试题及标准答案
  6. 音频混音接口调节音量及设置静音
  7. centos修改系统可用内存_centos7开启交换内存
  8. 内网渗透之Socks代理简介
  9. 堆的c语言实现以及简单应用
  10. MATLAB面板布局—便捷美观