Path: blob/master/modules/core/src/mathfuncs_core.dispatch.cpp
16337 views
// This file is part of OpenCV project.1// It is subject to the license terms in the LICENSE file found in the top-level directory2// of this distribution and at http://opencv.org/license.html.34#include "precomp.hpp"56#include "mathfuncs_core.simd.hpp"7#include "mathfuncs_core.simd_declarations.hpp" // defines CV_CPU_DISPATCH_MODES_ALL=AVX2,...,BASELINE based on CMakeLists.txt content89namespace cv { namespace hal {1011///////////////////////////////////// ATAN2 ////////////////////////////////////1213void fastAtan32f(const float *Y, const float *X, float *angle, int len, bool angleInDegrees )14{15CV_INSTRUMENT_REGION();1617CALL_HAL(fastAtan32f, cv_hal_fastAtan32f, Y, X, angle, len, angleInDegrees);1819CV_CPU_DISPATCH(fastAtan32f, (Y, X, angle, len, angleInDegrees),20CV_CPU_DISPATCH_MODES_ALL);21}2223void fastAtan64f(const double *Y, const double *X, double *angle, int len, bool angleInDegrees)24{25CV_INSTRUMENT_REGION();2627CALL_HAL(fastAtan64f, cv_hal_fastAtan64f, Y, X, angle, len, angleInDegrees);2829CV_CPU_DISPATCH(fastAtan64f, (Y, X, angle, len, angleInDegrees),30CV_CPU_DISPATCH_MODES_ALL);31}3233// deprecated34void fastAtan2(const float *Y, const float *X, float *angle, int len, bool angleInDegrees )35{36CV_INSTRUMENT_REGION();3738fastAtan32f(Y, X, angle, len, angleInDegrees);39}4041void magnitude32f(const float* x, const float* y, float* mag, int len)42{43CV_INSTRUMENT_REGION();4445CALL_HAL(magnitude32f, cv_hal_magnitude32f, x, y, mag, len);46// SSE42 performance issues47CV_IPP_RUN(IPP_VERSION_X100 > 201800 || cv::ipp::getIppTopFeatures() != ippCPUID_SSE42, CV_INSTRUMENT_FUN_IPP(ippsMagnitude_32f, x, y, mag, len) >= 0);4849CV_CPU_DISPATCH(magnitude32f, (x, y, mag, len),50CV_CPU_DISPATCH_MODES_ALL);51}5253void magnitude64f(const double* x, const double* y, double* mag, int len)54{55CV_INSTRUMENT_REGION();5657CALL_HAL(magnitude64f, cv_hal_magnitude64f, x, y, mag, len);58// SSE42 performance issues59CV_IPP_RUN(IPP_VERSION_X100 > 201800 || cv::ipp::getIppTopFeatures() != ippCPUID_SSE42, CV_INSTRUMENT_FUN_IPP(ippsMagnitude_64f, x, y, mag, len) >= 0);6061CV_CPU_DISPATCH(magnitude64f, (x, y, mag, len),62CV_CPU_DISPATCH_MODES_ALL);63}646566void invSqrt32f(const float* src, float* dst, int len)67{68CV_INSTRUMENT_REGION();6970CALL_HAL(invSqrt32f, cv_hal_invSqrt32f, src, dst, len);71CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsInvSqrt_32f_A21, src, dst, len) >= 0);7273CV_CPU_DISPATCH(invSqrt32f, (src, dst, len),74CV_CPU_DISPATCH_MODES_ALL);75}767778void invSqrt64f(const double* src, double* dst, int len)79{80CV_INSTRUMENT_REGION();8182CALL_HAL(invSqrt64f, cv_hal_invSqrt64f, src, dst, len);83CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsInvSqrt_64f_A50, src, dst, len) >= 0);8485CV_CPU_DISPATCH(invSqrt64f, (src, dst, len),86CV_CPU_DISPATCH_MODES_ALL);87}888990void sqrt32f(const float* src, float* dst, int len)91{92CV_INSTRUMENT_REGION();9394CALL_HAL(sqrt32f, cv_hal_sqrt32f, src, dst, len);9596CV_CPU_DISPATCH(sqrt32f, (src, dst, len),97CV_CPU_DISPATCH_MODES_ALL);98}99100101void sqrt64f(const double* src, double* dst, int len)102{103CV_INSTRUMENT_REGION();104105CALL_HAL(sqrt64f, cv_hal_sqrt64f, src, dst, len);106107CV_CPU_DISPATCH(sqrt64f, (src, dst, len),108CV_CPU_DISPATCH_MODES_ALL);109}110111void exp32f(const float *src, float *dst, int n)112{113CV_INSTRUMENT_REGION();114115CALL_HAL(exp32f, cv_hal_exp32f, src, dst, n);116CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsExp_32f_A21, src, dst, n) >= 0);117118CV_CPU_DISPATCH(exp32f, (src, dst, n),119CV_CPU_DISPATCH_MODES_ALL);120}121122void exp64f(const double *src, double *dst, int n)123{124CV_INSTRUMENT_REGION();125126CALL_HAL(exp64f, cv_hal_exp64f, src, dst, n);127CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsExp_64f_A50, src, dst, n) >= 0);128129CV_CPU_DISPATCH(exp64f, (src, dst, n),130CV_CPU_DISPATCH_MODES_ALL);131}132133void log32f(const float *src, float *dst, int n)134{135CV_INSTRUMENT_REGION();136137CALL_HAL(log32f, cv_hal_log32f, src, dst, n);138CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsLn_32f_A21, src, dst, n) >= 0);139140CV_CPU_DISPATCH(log32f, (src, dst, n),141CV_CPU_DISPATCH_MODES_ALL);142}143144void log64f(const double *src, double *dst, int n)145{146CV_INSTRUMENT_REGION();147148CALL_HAL(log64f, cv_hal_log64f, src, dst, n);149CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippsLn_64f_A50, src, dst, n) >= 0);150151CV_CPU_DISPATCH(log64f, (src, dst, n),152CV_CPU_DISPATCH_MODES_ALL);153}154155//=============================================================================156// for compatibility with 3.0157158void exp(const float* src, float* dst, int n)159{160exp32f(src, dst, n);161}162163void exp(const double* src, double* dst, int n)164{165exp64f(src, dst, n);166}167168void log(const float* src, float* dst, int n)169{170log32f(src, dst, n);171}172173void log(const double* src, double* dst, int n)174{175log64f(src, dst, n);176}177178void magnitude(const float* x, const float* y, float* dst, int n)179{180magnitude32f(x, y, dst, n);181}182183void magnitude(const double* x, const double* y, double* dst, int n)184{185magnitude64f(x, y, dst, n);186}187188void sqrt(const float* src, float* dst, int len)189{190sqrt32f(src, dst, len);191}192193void sqrt(const double* src, double* dst, int len)194{195sqrt64f(src, dst, len);196}197198void invSqrt(const float* src, float* dst, int len)199{200invSqrt32f(src, dst, len);201}202203void invSqrt(const double* src, double* dst, int len)204{205invSqrt64f(src, dst, len);206}207208}} // namespace cv::hal::209210float cv::fastAtan2( float y, float x )211{212using namespace cv::hal;213CV_CPU_CALL_BASELINE(fastAtan2, (y, x));214}215216217