本帖最后由 ancientcc 于 2017-8-29 11:07 编辑 cv_cpu_config.h 由cmake生成,指示了要使用的优化设置。以下是一个例子,支持优化指令集:SSE、SSE2、SSE_1、SSE_2、FP16、AVX、AVX2。
让以fastAtan32f为例,描述OpenCV如何根据特定指令集进行优化过程。
让深入CALL_HAL。
CALL_HAL最后执行hal_ni_fastAtan32f,它就是空操作,但由于返回CV_HAL_ERROR_NOT_IMPLEMENTED,调用它的fastAtan32f会继续执行后面的CV_CPU_DISPATCH,正是这个宏执行了真正操作。在深入这宏前让介绍mathfuncs_core.dispatch.cpp中的两条include语句。
第一个include作用是两个,1)声明cpu_baseline版本,2)实现baseline版本,这是通过不定义CV_CPU_OPTIMIZATION_DECLARATIONS_ONLY宏,使得mathfuncs_core.simd.hpp包含实现。第二个include也两个作用,1)声明特殊指令集版本(只是声明),2)定义一个叫CV_CPU_DISPATCH_MODES_ALL的宏。
CV_CPU_DISPATCH_MODES_ALL宏指示了每个模块实现了的指令集版本。它实现了4种指令集,AVX2、AVX、SSE2是特殊指令集,BASELINE则是cpu_baseline实现。 上面4个种版本,cpu_baseline的函数已由第一个include实现,三种特殊指令集则由另外三个源文件实现,它们有着一样内容。
要编译这三个文件,必须在文件层定义一个叫CV_CPU_DISPATCH_MODE的宏。
有了这4个版本的fastAtan32f实现,让回到CV_CPU_DISPATCH,看它是如何调用这四个函数。以下这个宏的伪代码。
baseline features和dispatched features
当中有两个宏:CV_CPU_COMPILE_AVX、CV_CPU_DISPATCH_COMPILE_AVX。回看cv_cpu_config.h,第一个是baseline features,第二个是dispatched features。baseline features指的是那些必须满足的SIMD。一旦运行在的cpu不支持这种SIMD,app会因为非法而退出。dispatched features指的是那些会运行时判断是否支持的指令集,即用cv::checkHardwareSupport运行时检查cpu是否能支持这种SIMD。 为让支持更多cpu,应尽可能低的定义baseline features。当前就是SSE、SSE2。 opencv3.3.0有BUG,必须把AVX、AVX2定义为baseline features。以下是个人解决这BUG方法。
|