本文主要是介绍关于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的指令集优化功能
这篇关于关于OpenCV源码中的CPU指令集CV_SSE2等的相关知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!