0
点赞
收藏
分享

微信扫一扫

OpenCV算法加速(4)官方源码v4.5.5的默认加速情况是什么?

opencv v4.5.5版本源码

1、并行库的使用情况

\opencv\sources\modules\core\src\parallel.cpp,里面默认使用的是微软PPL加速方式,

#if defined _MSC_VER && _MSC_VER >= 1600
    #define HAVE_CONCURRENCY
#endif

cmake里面的编译选项,其他方式如TBB,HPX,OPENMP默认是关闭的。

2、指令集优化默认是开启的

cmake编译选项,\opencv\sources\x64\cvconfig.h,宏定义CV_ENABLE_INTRINSICS默认是开启的

#ifndef OPENCV_CVCONFIG_H_INCLUDED
#define OPENCV_CVCONFIG_H_INCLUDED

/* OpenCV compiled as static or dynamic libs */
#define BUILD_SHARED_LIBS

/* OpenCV intrinsics optimized code */
#define CV_ENABLE_INTRINSICS

/* OpenCV additional optimized code */
/* #undef CV_DISABLE_OPTIMIZATION */

源码\opencv\sources\modules\core\src\system.cpp,有函数设置和查看优化的情况:

volatile bool useOptimizedFlag = true;

void setUseOptimized( bool flag )
{
    useOptimizedFlag = flag;
    currentFeatures = flag ? &featuresEnabled : &featuresDisabled;

    ipp::setUseIPP(flag);
#ifdef HAVE_OPENCL
    ocl::setUseOpenCL(flag);
#endif
}

bool useOptimized(void)
{
    return useOptimizedFlag;
}

3、来看看canny算子的优化情况是什么?

\opencv\sources\modules\imgproc\src\canny.cpp,源码有宏定义#if CV_SIMD,

如果使能了CV_SIMD,就会开启指令集的优化源码,CV_SIMD在头文件

\opencv\sources\modules\core\include\opencv2\core\hal\intrin.hpp,有定义

namespace CV__SIMD_NAMESPACE {
    #define CV_SIMD CV_SIMD128

4、写个测试用例

void checkSimd()
{
    //查询opencv线程
    int numTh = cv::getNumThreads(); //默认值是cpu的逻辑线程数
    int numCore = cv::getNumberOfCPUs();
    std::cout << "getNumThreads=" << numTh << std::endl;
    std::cout << "getNumberOfCPUs=" << numCore << std::endl;
 
    //查询opencv当前是否开启了并行优化功能
    bool opt = cv::useOptimized(); //默认值是true
    std::cout << "useOptimized=" << opt << std::endl;
 
    //查询opencv当前是否支持具体的CPU指令集
    bool check1 = cv::checkHardwareSupport(CV_CPU_SSE4_1);
    bool check2 = cv::checkHardwareSupport(CV_CPU_SSE4_2);
    bool check3 = cv::checkHardwareSupport(CV_CPU_AVX2);
    std::cout << "CV_CPU_SSE4_1=" << check1 << std::endl;
    std::cout << "CV_CPU_SSE4_2=" << check2 << std::endl;
    std::cout << "CV_CPU_AVX2=" << check3 << std::endl;
 
    //cv::setUseOptimized(false);
    //cv::setNumThreads(1);
}

int main()
{
    checkSimd();
    return 0;
}
举报

相关推荐

0 条评论