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、參考文獻
《并行編程方法與優化實踐》,劉文志
總結
以上是生活随笔為你收集整理的OpenCV算法加速(2)使用SIMD指令集(MMX、SSE、AVX)和MIPP实现视觉算法优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英特尔的指令集体系结构_INTEL 体系
- 下一篇: MMX的数据结构 MMX指令集