关于OpenCV源码中的CPU指令集CV_SSE2等的相关知识


在这篇博客中,我将会给大家分享关于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的指令集优化功能

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值