OpenCV算法加速(2)使用SIMD指令集(MMX、SSE、AVX)和MIPP实现视觉算法优化
一、概述
很多人覺得OpenCV速度比較慢,其實提升OpenCV運行速度,最常見的就是重新編譯OpenCV,添加各種指令集優(yōu)化支持。
SIMD(Single Instruction Multiple Data ),顧名思義,就是單條指令處理多個數(shù)據(jù)。比如我們處理BYTE類型的乘法,也是需要32位寄存器來做處理.這樣顯得有些浪費.實際上我們可以把乘數(shù)合并,一次32位的乘法得到兩個乘法結(jié)果.示例代碼如下:
R1 = a1*b;
R2 = a2*b;
轉(zhuǎn)換成
T1 = (a1 | (a2 <<16))*b;
R1 = T1&0xffff;
R2 = T1>>16;
在游戲/多媒體等典型的圖形處理應(yīng)用中,我們經(jīng)常需要對連續(xù)密集的數(shù)據(jù)進行處理.這正是SIMD長處.
SIMD(Single Instruction Multiple Data)指令集,這個古老的東西,從第一代開始算起,也快有近20年的歷史了,從最開始的MMX技術(shù),到SSE,以及后來的SSE2、SSE3、SSE4、AVX以及11年以后的AVX2,逐漸的成熟和豐富,不過目前考慮通用性方面,AVX的輻射范圍還是有限,大部分在優(yōu)化時還是考慮使用128位的SSE指令集。
SIMD指令集,指單指令多數(shù)據(jù)流技術(shù),可用一組指令對多組數(shù)據(jù)通進行并行操作。SIMD指令可以在一個控制器上控制同時多個平行的處理微元,一次指令運算執(zhí)行多個數(shù)據(jù)流,這樣在很多時候可以提高程序的運算速度。
SIMD指令在本質(zhì)上非常類似一個向量處理器,可對控制器上的一組數(shù)據(jù)(又稱“數(shù)據(jù)向量”) 同時分別執(zhí)行相同的操作從而實現(xiàn)空間上的并行。SIMD是CPU實現(xiàn)DLP(Data Level Parallelism)的關(guān)鍵,DLP就是按照SIMD模式完成計算的。SSE和較早的MMX和 AMD的3DNow!都是SIMD指令集。它可以通過單指令多數(shù)據(jù)技術(shù)和單時鐘周期并行處理多個浮點來有效地提高浮點運算速度。
在CMake階段:
啟用SSE指令集,SSE3/SSE4,AVX/AVX2
勾選支持 ENABLE_AVX ENABLE_AVX2 ENABLE_POPCNT
勾選 TBB支持
如果有英偉達顯卡,勾選 CUDA相關(guān)選項
代碼實現(xiàn)階段:
1. 多用指針
2. 框架 parallel_for_ 編程,支持OpenMP、pthreads、C++11 threads、Intel TBB、Microsoft并發(fā)或GCD等在不同系統(tǒng)上。
3. 多看OpenCV源碼,實現(xiàn)SSE編程重寫
4. CUDA編程實現(xiàn)
上述主要針對傳統(tǒng)的圖像處理模塊! 對深度神經(jīng)網(wǎng)絡(luò)-DNN模塊,OpenCV支持OpenVINO加速執(zhí)行是一個很好的選擇。
總結(jié),基本上OpenCV通過上述手段加速,特別是并行對卷積操作特別有效,常規(guī)的3D卷積加速可以達到300倍左右!CUDA對傳統(tǒng)的圖像處理可以達到30~100之間,可以說基本上讓OpenCV性能速度可以達到工業(yè)級應(yīng)用要求!
OpenCV加速與優(yōu)化,讓代碼執(zhí)行速度飛起來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++程序員設(shè)計。它為圖像處理提供了許多有用的高性simd庫更多下載資源、學(xué)習資料請訪問CSDN下載頻道.https://download.csdn.net/download/weixin_38697808/16647075使用SIMD的C++圖像處理和機器學(xué)習庫:SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX(Altivec)和VSX(Power7),NEONforARM。-C/C++開發(fā)_-互聯(lián)網(wǎng)文檔類資源-CSDN下載使用SIMD的C++圖像處理和機器學(xué)習庫:SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX(Altivec)和VSX(Power7),NEONforARM。-C/C++開發(fā),使用SIMD的C++圖像處理庫:SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX(Altivec)和VSX(Power7),NEONforARM。簡介Simd庫是一個免費的開源圖像處理和機器學(xué)習庫,專為C和C++程序員設(shè)計。它為圖像處理提供了許多有用的高性能算法,例如:像素格式轉(zhuǎn)換,圖像縮放和過濾,從圖像中提取統(tǒng)計信息,運動檢測,對象檢測(HAAR和LBP分類器級聯(lián))和分類,神經(jīng)網(wǎng)絡(luò)。通過使用不同的SIMDCPU擴展來優(yōu)化算法。更多下載資源、學(xué)習資料請訪問CSDN下載頻道https://download.csdn.net/download/weixin_42105169/19102541pixel:C和SIMD進行圖像處理,有時比OpenCV更快-源碼_-互聯(lián)網(wǎng)文檔類資源-CSDN下載pixel:C和SIMD進行圖像處理,有時比OpenCV更快-源碼,像素點此回購包含一些有關(guān)基本圖像處理的單獨程序。它主要是出于個人學(xué)習的目的,我將繼續(xù)編寫它們的樸素(純C)和SIMD(ARMNEON,SSE)優(yōu)化版本。隨時為該回購創(chuàng)建問題/觀看/提出拉取請求。更多下載資源、學(xué)習資料請訪問CSDN下載頻道https://download.csdn.net/download/weixin_42130889/15821968
二、SIMD指令集SSE/AVX
使用軟件CPU-Z可以查看電腦CPU支持哪些指令集
?使用Intrinsics函數(shù)操作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官網(wǎng):
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、應(yīng)用案例?
單線程、SSE、AVX運行效率對比——加法運算_samylee的博客-CSDN博客_avx加速使用Intrinsics函數(shù)操作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前言單列數(shù)組下,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執(zhí)行效率比_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博客本次測試矩陣乘法未作分塊優(yōu)化。未使用cuda測試。采用微妙級的計時器。分別對16階方矩陣到4048階方陣采用如下方式做乘法計算,統(tǒng)計結(jié)果。C++Amp(GPU),C++PPL(多線程16核),SSE/AVX(單線程),AVX-Db(單線程,雙精度),Serial(單線程串行)時間統(tǒng)計如下(單位:秒)Rank :16326412825651210...https://blog.csdn.net/carlclouder/article/details/104281311源碼分享:C++矩陣類CLMatrixT,功能強大使用簡單,支持內(nèi)存池、寬指令、并行化加速!持續(xù)更新..._carlclouder的博客-CSDN博客C++矩陣類模板CLMatrixT:C++矩陣類模板CLMatrixT介紹:特點先演示使用方法:再看運行測試結(jié)果:最后分享源代碼:C++矩陣類模板CLMatrixT介紹:最近在研究AI和深度學(xué)習,矩陣計算代碼基本全是python的,C++基本沒有成熟的庫。而矩陣計算中,許多python的矩陣計算例子用法都很簡單,感覺C++也應(yīng)該有屬于自己的矩陣處理類,即可享受C++的速度又可享受面向?qū)ο缶幊谭?..https://blog.csdn.net/carlclouder/article/details/104099941
基于AVX256指令集和多線程優(yōu)化的雙機計算加速程序_Echoooooh的博客-CSDN博客_avx 多線程任務(wù)背景大三上學(xué)期的課程設(shè)計任務(wù)。大概是要做一個計算加速的模型,通過將計算任務(wù)分配給兩臺計算機來進行計算加速,在其中的每一臺計算機上再通過并行運算指令集和多線程加速,盡可能的獲得高的加速比。共同作者@Chelsea_n老師給出的大作業(yè)要求利用相關(guān)C++需要和加速(sse,多線程)手段,以及通訊技術(shù)(1.rpc,命名管道,2.http,socket)等實現(xiàn)函數(shù)(浮點數(shù)數(shù)組求和,求最大值,排序)。處理在兩臺計算機協(xié)作執(zhí)行,盡可能挖掘兩個計算機的潛在算力。計算任務(wù)1280萬浮點數(shù)進行求和、求最大值https://blog.csdn.net/qq_44319285/article/details/113307715
三、SIMD指令集(MMX和SSE)實現(xiàn)的opencv算子加速
[03] 圖像算法優(yōu)化 - 隨筆分類 - Imageshop - 博客園https://www.cnblogs.com/Imageshop/category/334067.html
SSE圖像算法優(yōu)化系列一:一段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圖像算法優(yōu)化系列四:圖像轉(zhuǎn)置的SSE優(yōu)化(支持8位、24位、32位),提速4-6倍 - Imageshop - 博客園轉(zhuǎn)置操作在很多算法上都有著廣泛的應(yīng)用,在數(shù)學(xué)上矩陣轉(zhuǎn)置更有著特殊的意義。在圖像處理上,某些情況下,轉(zhuǎn)置也能有效的提高算法效率,比如很多行列可分離的算法,在很多情況下,行和列方向的算法邏輯隨相同,但是由https://www.cnblogs.com/Imageshop/p/6796485.html
SSE圖像算法優(yōu)化系列七:基于SSE實現(xiàn)的極速的矩形核腐蝕和膨脹(最大值和最小值)算法。https://www.cnblogs.com/Imageshop/p/7018510.html
SSE圖像算法優(yōu)化系列九:靈活運用SIMD指令16倍提升Sobel邊緣檢測的速度(4000*3000的24位圖像時間由480ms降低到30ms)。 - Imageshop - 博客園這半年多時間,基本都在折騰一些基本的優(yōu)化,有很多都是十幾年前的技術(shù)了,從隨大流的角度來考慮,研究這些東西在很多人看來是浪費時間了,即不能賺錢,也對工作能力提升無啥幫助。可我覺得人類所謂的幸福,可以分為https://www.cnblogs.com/Imageshop/p/7285564.htmlSSE圖像算法優(yōu)化系列十三:超高速BoxBlur算法的實現(xiàn)和優(yōu)化(Opencv的速度的五倍) - Imageshop - 博客園再次觸發(fā)靈感,終于將懶惰算法的圖像模糊算法使用了SIMD指令集實現(xiàn),速度比opencv的cvSmooth函數(shù)快近5倍,在一臺老舊的I3筆記本上處理3000*2000的灰度圖達到了6ms的速度,本文分享https://www.cnblogs.com/Imageshop/p/8302990.html【算法隨記一】Canny邊緣檢測算法實現(xiàn)和優(yōu)化分析。 - Imageshop - 博客園經(jīng)典的Canny邊緣檢測算法實現(xiàn)過程中部分細節(jié)的描述,開發(fā)記錄等。https://www.cnblogs.com/Imageshop/p/10664478.html用最簡單的方式在C#中使用多線程加速耗時的圖像處理算法的執(zhí)行(多核機器)。 - Imageshop - 博客園圖像處理中,有很多算法由于其內(nèi)在的復(fù)雜性是天然的耗時大戶,加之圖像本身蘊涵的數(shù)據(jù)量比一般的對象就大,因此,針對這類算法,執(zhí)行速度的提在很大程度上依賴于硬件的性能,現(xiàn)在流行的CPU都是至少2核的,稍微好https://www.cnblogs.com/Imageshop/p/3344103.html
四、MIPP
1、MIPP是什么?
MIPP 是用 C++11 編寫的向量內(nèi)在函數(shù) (SIMD) 的可移植和開源包裝器(MIT 許可)。 它適用于 SSE、AVX、AVX-512 和 ARM NEON(32 位和 64 位)指令。 MIPP 包裝器支持簡單/雙精度浮點數(shù)以及有符號整數(shù)運算(64 位、32 位、16 位和 8 位)。
使用 MIPP 包裝器,您不再需要編寫特定的內(nèi)部代碼。 只需使用提供的函數(shù),包裝器就會自動為您的特定架構(gòu)生成正確的內(nèi)部調(diào)用。
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的應(yīng)用案例 --- 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、參考文獻
《并行編程方法與優(yōu)化實踐》,劉文志
總結(jié)
以上是生活随笔為你收集整理的OpenCV算法加速(2)使用SIMD指令集(MMX、SSE、AVX)和MIPP实现视觉算法优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 英特尔的指令集体系结构_INTEL 体系
- 下一篇: MMX的数据结构 MMX指令集
