在这篇博客中,我将会给大家分享关于OpenCV源码中的CPU指令集CV_SSE2等的相关知识
一、
CV_SSE系列指令集的预编译符号定义在opencv2/core/internal.hpp这个头文件中,如果你不包含这个头文件的话,把源码拷贝到自己的函数中,CV_SSE是不被定义的
下面是harrisCorner中的一部分代码
在上述代码中,如果条件编译符号CV_SSE被定义过,则调用checkHardwareSupport(CV_CPU_SSE); 获取你的电脑上的CPU是否支持CPU_SSE指令集优化特性。如果查询结果为真,就说明你的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的取值有以下几种:
请看一下代码:
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc ,char** args)
{
//设置是否启用指令集优化特性
cv::setUseOptimized(true);
//获取当前机器的CPU指令集支持特性
bool opt_status = cv::useOptimized();
cout<<"当前的指令集优化状态:"<<opt_status<<endl;
//检查硬件支持
volatile bool simd = checkHardwareSupport(CV_CPU_SSE);
cout<<"HardwareSupport(CV_CPU_SSE): "<<simd<<endl;
simd = checkHardwareSupport(CV_CPU_MMX);
cout<<"HardwareSupport(CV_CPU_MMX): "<<simd<<endl;
simd = checkHardwareSupport(CV_CPU_SSE2);
cout<<"HardwareSupport(CV_CPU_SSE2): "<<simd<<endl;
simd = checkHardwareSupport(CV_CPU_SSE3);
cout<<"HardwareSupport(CV_CPU_SSE3): "<<simd<<endl;
simd = checkHardwareSupport(CV_CPU_SSSE3);
cout<<"HardwareSupport(CV_CPU_SSSE3): "<<simd<<endl;
simd = checkHardwareSupport(CV_CPU_SSE4_1);
cout<<"HardwareSupport(CV_CPU_SSE4_1): "<<simd<<endl;
simd = checkHardwareSupport(CV_CPU_SSE4_2);
cout<<"HardwareSupport(CV_CPU_SSE4_2): "<<simd<<endl;
simd = checkHardwareSupport(CV_CPU_POPCNT);
cout<<"HardwareSupport(CV_CPU_POPCNT): "<<simd<<endl;
simd = checkHardwareSupport(CV_CPU_AVX);
cout<<"HardwareSupport(CV_CPU_AVX): "<<simd<<endl;
return getchar();
}
在上述代码中,如果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的指令集优化功能