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;
}