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