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

一、概述

很多人觉得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、参考文献

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

  • 17
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
SSE (Streaming SIMD Extensions) 和 AVX (Advanced Vector Extensions) 是英特尔处理器的指令集扩展,用于实现单指令多数据 (SIMD) 并行处理。在排序算法中,可以利用 SSEAVX 提供的向量指令来加速排序过程。 在使用 SSEAVX 进行排序时,可以将待排序的数据划分为多个小块,然后对每个小块进行并行排序。排序算法的基本思想是将数据加载到 SIMD 寄存器中,并使用向量指令进行比较和交换操作。通过并行处理多个数据,可以极大地提高排序的效率。 对于较小的数据集,可以使用插入排序、冒泡排序或选择排序等简单的排序算法,并结合 SSEAVX 指令进行优化。这样可以减少比较和交换的次数,并利用向量指令同时对多个数据进行操作。 对于较大的数据集,可以使用更复杂的排序算法如归并排序、快速排序等,并借助 SSEAVX 进行优化。例如,在归并排序中,可以将待排序的数据分割为多个子序列,并使用 SSEAVX 进行并行的归并操作。 此外,在排序算法中还可以利用 SSEAVX 提供的指令进行数据的加载、存储和移动。这些指令可以高效地对数据进行复制、填充、移位等操作,从而进一步提高排序算法的性能。 总之,SSEAVX 是用于实现 SIMD 并行处理的指令集扩展,可以在排序算法中利用 SIMD 操作的优势,通过并行处理多个数据,提高排序算法的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值