在這個博客。我想分享一下OpenCV源代碼CPU指令系統CV_SSE2和其他相關知識
一個、
CV_SSE系列指令集的預編譯符號定義在opencv2/core/internal.hpp這個頭文件里,假設你不包括這個頭文件的話。把源代碼復制到自己的函數中,CV_SSE是不被定義的
以下是harrisCorner中的一部分代碼
假設查詢結果為真,就說明你的CPU在當前狀態下支持CPU_SSE指令集優化特性。
假設查詢結果為假。就說明你的CPU不支持CPU_SSE指令集優化。可是這並不說明你的CPU硬件本身不支持SSE指令集優化特性。
二、
CPU指令集優化功能能夠依據須要開啟或關閉:
首先能夠使用此函數
bool cv::useOptimized()
來查詢當前是否開啟了CPU指令集優化功能。
能夠使用函數
void cv::setUseOptimized(bool onoff)
來設置是否開啟CPU指令集優化功能;
能夠使用此函數
bool checkHardwareSupport(int feature);
來查詢你的CPU是否支持某種指令集優化特性。
feature的取值有下面幾種:

請看一下代碼:
在上述代碼中,假設setUseOptimized()函數的參數為true的話,則CPU的硬件指令優化功能被開啟。狀態函數opt_status = cv::useOptimized()返回為真,
並且在上述代碼中我們查詢了我的機器的CPU指令優化支持特性,我的CPU型號為Inter Core(TM) i5 650 的。查詢結果顯演示樣例如以下:

能夠看到,我的CPU支持絕大多數的指令集優化特性。僅僅有最后一個CPU_AVX是0,雖然我們用程序指令開啟了指令集優化特性,可是CPU_AVX依舊是0,這就說明我的CPU在硬件層面上不提供CPU_AVX的優化功能,即使setUseOptimized()函數的參數為true。也無法使用此功能。
假設setUseOptimized()函數的參數為false的話,則CPU的硬件指令優化功能被關閉。狀態函數opt_status = cv::useOptimized()返回為假。上述代碼的執行結果為

能夠看到,此時全部的CPU指令集優化功能都被禁止了,即使CPU硬件本身支持的特性,也被禁止使用了。
所以在你的程序中,你能夠在main()主函數中通過setUseOptimized()功能設置是否啟用OpenCV指令集的優化
版權聲明:本文博客原創文章。博客,未經同意,不得轉載。