OpenCV算法加速(4)官⽅源码v4.5.5的默认并⾏和优化加速的编译选项是什么?请重点。。。
举例opencv v4.5.5版本源码,Windows x64,VS2019,CMake
下载安装opencv-4.5.,得到官⽅编译的动态库opencv_world455.dll
1、多线程并⾏库的使⽤情况
PPL
\opencv\sources\modules\core\src\parallel.cpp,⾥⾯默认使⽤的是微软PPL加速⽅式,
#if defined _MSC_VER && _MSC_VER >= 1600
#define HAVE_CONCURRENCY
#endif
cmake⾥⾯的编译选项,其他⽅式如TBB,HPX,OPENMP默认是关闭的。
\opencv\sources\x64\cvconfig.h,⾥⾯有宏定义的。
兔子养殖吧/* Halide support */
/* #undef HAVE_HALIDE */
/* Intel Integrated Performance Primitives */
/* #undef HAVE_IPP */
/* #undef HAVE_IPP_ICV */
/* #undef HAVE_IPP_IW */
/* #undef HAVE_IPP_IW_LL */火灾应急预案
/* Intel Threading Building Blocks */
/* #undef HAVE_TBB */
/
* Ste||ar Group High Performance ParallelX */
/* #undef HAVE_HPX */
/* OpenVX */
/* #undef HAVE_OPENVX */
2、GPU之OpenCL
cmake⾥⾯的编译选项,默认是开启OpenCL的。
\opencv\sources\x64\cvconfig.h
/* OpenCL Support */
#define HAVE_OPENCL
/* #undef HAVE_OPENCL_STATIC */
/* #undef HAVE_OPENCL_SVM */
/* NVIDIA OpenCL D3D Extensions support */
#define HAVE_OPENCL_D3D11_NV
GPU之CUDA
cmake⾥⾯的编译选项,默认是禁⽤CUDA的。需要⽤户⾃⼰勾选,并下载库编译。
3、SIMD指令集优化选项
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 */
cmake编译选项,\opencv\sources\x64\cv_cpu_config.h
// OpenCV CPU baline features
#define CV_CPU_COMPILE_SSE 1
维修工作总结
#define CV_CPU_BASELINE_COMPILE_SSE 1
#define CV_CPU_COMPILE_SSE2 1
#define CV_CPU_BASELINE_COMPILE_SSE2 1
#define CV_CPU_COMPILE_SSE3 1
#define CV_CPU_BASELINE_COMPILE_SSE3 1
#define CV_CPU_BASELINE_FEATURES 0 \
, CV_CPU_SSE \
, CV_CPU_SSE2 \
, CV_CPU_SSE3 \
// OpenCV supported CPU dispatched features
#define CV_CPU_DISPATCH_COMPILE_SSE4_1 1
#define CV_CPU_DISPATCH_COMPILE_SSE4_2 1
#define CV_CPU_DISPATCH_COMPILE_FP16 1
#define CV_CPU_DISPATCH_COMPILE_AVX 1
#define CV_CPU_DISPATCH_COMPILE_AVX2 1
#define CV_CPU_DISPATCH_COMPILE_AVX512_SKX 1
#define CV_CPU_DISPATCH_FEATURES 0 \
, CV_CPU_SSE4_1 \
米粉制作, CV_CPU_SSE4_2 \
, CV_CPU_FP16 \
, CV_CPU_AVX \
,
CV_CPU_AVX2 \
, CV_CPU_AVX512_SKX \
关于OpenCV硬件加速,OpenCV Hardware Acceleration Layer(HAL),请参考博⽂:
4、IPP加速
Intel® Integrated Performance Primitives (简称Intel® IPP)是⼀个软件库,提供了⼤量的函数。包括信号处理、图像处理、计算机视觉、数据压缩和字符串操作。通过对函数的优化,⽐如适配指令集操作等来提升运⾏效率。
完整版的IPP下载地址:
在 Learning OpenCV 这本书中,作者提到OpenCV可以利⽤Intel的IPP性能库来提升程序的运⾏速度,⽽这个IPP库是要另外进⾏购买的。实际上,Intel为当前的OpenCV免费提供了IPP加速库的⼀部分,在此我们称之为ippicv。ippicv会在cmake的时候⾃动从github上下载,但是在⽹络状况不佳的情况下会下载失败。这时候我们只能采⽤⼿动安装的⽅式。ippicv的下载地址其实就藏在ake⽂件中。
⾥⾯的变量组合起来就是ippicv的下载⽹址:
或者直接访问这个⽹址也可以获得:
如果在英特尔的处理器上使⽤,OpenCV就会⾃动使⽤⼀种免费的英特尔集成性能原语库(IPP)的⼦集,IPP 8.x(IPPICV)。IPPICV可以在编译阶段链接到OpenCV,这样⼀来,会替代相应的低级优化的C语⾔代码(在cmake中设置WITH_IPP=ON/OFF开启或者关闭这⼀功能,默认情况为开启)。使⽤IPP获得的速度提升⾮常可观,如下图显⽰了使⽤IPP之后得到的加速效果。
5、怎么知道当前OpenCV开启了哪些加速模式?
源码\opencv\sources\modules\core\src\system.cpp,有专门的函数设置和查看优化的情况:volatile bool uOptimizedFlag = true;
void tUOptimized( bool flag )
{
uOptimizedFlag = flag;
currentFeatures = flag ? &featuresEnabled : &featuresDisabled;
ipp::tUIPP(flag);
#ifdef HAVE_OPENCL
ocl::tUOpenCL(flag);
#endif
}
bool uOptimized(void)
{
return uOptimizedFlag;
}
void tUIPP(bool flag)
{
CoreTLSData& data = getCoreTlsData();
#ifdef HAVE_IPP
data.uIPP = (getIPPSingleton().uIPP)?flag:fal;
#el
CV_UNUSED(flag);
data.uIPP = fal;
#endif
}
\opencv\sources\modules\core\src\ocl.cpp
void tUOpenCL(bool flag)
{
if (!flag)
uOpenCL_ = 0;
el
uOpenCL_ = -1;
}
苹果儿歌已知宏HAVE_OPENCL是已定义的,HAVE_IPP也是已定义的。所以OpenCL和IPP的功能默认是启动的。可以通过以下测试⽤例,来查询当前的opencv是否开启了OPENCL和IPP
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/core/ocl.hpp>
缺点的反义词#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
void checkIPP()
{
bool u = cv::ipp::uIPP();
bool uNE = cv::ipp::uIPP_NotExact();圆的面积公式和周长公式
int status = cv::ipp::getIppStatus();
cv::String ver = cv::ipp::getIppVersion();
cv::String loc = cv::ipp::getIppErrorLocation();
std::cout << "IPP u:" << u << std::endl;
std::cout << "IPP uNE:" << uNE << std::endl;
std::cout << "IPP status:" << status << std::endl;
std::cout << "IPP ver:" << ver << std::endl;
std::cout << "IPP loc:" << loc << std::endl;
}
void checkOCL()
{
//查询opencv当前是否开启了OpenCL功能
bool ret1 = cv::ocl::haveOpenCL();
bool ret2 = cv::ocl::uOpenCL();
std::cout << "default haveOpenCL:" << ret1 << std::endl;
std::cout << "default uOpenCL:" << ret2 << std::endl;
}
6、最后,举例来看看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,有定义