Merge pull request #7467 from tomoaki0705:featureCheckSimdUniversal

This commit is contained in:
Vadim Pisarevsky 2016-11-02 12:30:55 +00:00
commit bebd49d91b
7 changed files with 180 additions and 144 deletions

View File

@ -132,7 +132,7 @@ static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
const PixType *row1 = img1.ptr<PixType>(y), *row2 = img2.ptr<PixType>(y); const PixType *row1 = img1.ptr<PixType>(y), *row2 = img2.ptr<PixType>(y);
PixType *prow1 = buffer + width2*2, *prow2 = prow1 + width*cn*2; PixType *prow1 = buffer + width2*2, *prow2 = prow1 + width*cn*2;
#if CV_SIMD128 #if CV_SIMD128
bool useSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); bool useSIMD = hasSIMD128();
#endif #endif
tab += tabOfs; tab += tabOfs;
@ -292,7 +292,7 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
}; };
static const v_uint16x8 v_LSB = v_uint16x8(0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80); static const v_uint16x8 v_LSB = v_uint16x8(0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
bool useSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); bool useSIMD = hasSIMD128();
#endif #endif
const int ALIGN = 16; const int ALIGN = 16;
@ -891,7 +891,7 @@ buffers(_buffers), img1(&_img1), img2(&_img2), dst_disp(_dst_disp), clipTab(_cli
ftzero = std::max(params.preFilterCap, 15) | 1; ftzero = std::max(params.preFilterCap, 15) | 1;
#if CV_SIMD128 #if CV_SIMD128
useSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); useSIMD = hasSIMD128();
#endif #endif
} }
@ -1054,7 +1054,7 @@ inline void accumulateCostsLeftTop(CostType* leftBuf, CostType* leftBuf_prev, Co
CostType& leftMinCost, CostType& topMinCost, int D, int P1, int P2) CostType& leftMinCost, CostType& topMinCost, int D, int P1, int P2)
{ {
#if CV_SIMD128 #if CV_SIMD128
if(checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON)) if(hasSIMD128())
{ {
v_int16x8 P1_reg = v_setall_s16(cv::saturate_cast<CostType>(P1)); v_int16x8 P1_reg = v_setall_s16(cv::saturate_cast<CostType>(P1));
@ -1166,7 +1166,7 @@ inline void accumulateCostsRight(CostType* rightBuf, CostType* topBuf, CostType*
CostType& rightMinCost, int D, int P1, int P2, int& optimal_disp, CostType& min_cost) CostType& rightMinCost, int D, int P1, int P2, int& optimal_disp, CostType& min_cost)
{ {
#if CV_SIMD128 #if CV_SIMD128
if(checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON)) if(hasSIMD128())
{ {
v_int16x8 P1_reg = v_setall_s16(cv::saturate_cast<CostType>(P1)); v_int16x8 P1_reg = v_setall_s16(cv::saturate_cast<CostType>(P1));

View File

@ -1772,6 +1772,17 @@ inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0,
//! @} //! @}
//! @name Check SIMD support
//! @{
//! @brief Check CPU capability of SIMD operation
static inline bool hasSIMD128()
{
return false;
}
//! @}
} }
#endif #endif

View File

@ -46,6 +46,7 @@
#define OPENCV_HAL_INTRIN_NEON_HPP #define OPENCV_HAL_INTRIN_NEON_HPP
#include <algorithm> #include <algorithm>
#include "opencv2/core/utility.hpp"
namespace cv namespace cv
{ {
@ -1216,6 +1217,16 @@ inline v_float16x4 v_cvt_f16(const v_float32x4& a)
} }
#endif #endif
//! @name Check SIMD support
//! @{
//! @brief Check CPU capability of SIMD operation
static inline bool hasSIMD128()
{
return checkHardwareSupport(CV_CPU_NEON);
}
//! @}
//! @endcond //! @endcond
} }

View File

@ -46,6 +46,7 @@
#define OPENCV_HAL_SSE_HPP #define OPENCV_HAL_SSE_HPP
#include <algorithm> #include <algorithm>
#include "opencv2/core/utility.hpp"
#define CV_SIMD128 1 #define CV_SIMD128 1
#define CV_SIMD128_64F 1 #define CV_SIMD128_64F 1
@ -1726,6 +1727,16 @@ inline v_float16x4 v_cvt_f16(const v_float32x4& a)
} }
#endif #endif
//! @name Check SIMD support
//! @{
//! @brief Check CPU capability of SIMD operation
static inline bool hasSIMD128()
{
return checkHardwareSupport(CV_CPU_SSE2);
}
//! @}
//! @endcond //! @endcond
} }

View File

@ -1197,7 +1197,7 @@ template <>
struct Div_SIMD<uchar> struct Div_SIMD<uchar>
{ {
bool haveSIMD; bool haveSIMD;
Div_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Div_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const uchar * src1, const uchar * src2, uchar * dst, int width, double scale) const int operator() (const uchar * src1, const uchar * src2, uchar * dst, int width, double scale) const
{ {
@ -1243,7 +1243,7 @@ template <>
struct Div_SIMD<schar> struct Div_SIMD<schar>
{ {
bool haveSIMD; bool haveSIMD;
Div_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Div_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const schar * src1, const schar * src2, schar * dst, int width, double scale) const int operator() (const schar * src1, const schar * src2, schar * dst, int width, double scale) const
{ {
@ -1289,7 +1289,7 @@ template <>
struct Div_SIMD<ushort> struct Div_SIMD<ushort>
{ {
bool haveSIMD; bool haveSIMD;
Div_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Div_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const ushort * src1, const ushort * src2, ushort * dst, int width, double scale) const int operator() (const ushort * src1, const ushort * src2, ushort * dst, int width, double scale) const
{ {
@ -1334,7 +1334,7 @@ template <>
struct Div_SIMD<short> struct Div_SIMD<short>
{ {
bool haveSIMD; bool haveSIMD;
Div_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Div_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const short * src1, const short * src2, short * dst, int width, double scale) const int operator() (const short * src1, const short * src2, short * dst, int width, double scale) const
{ {
@ -1379,7 +1379,7 @@ template <>
struct Div_SIMD<int> struct Div_SIMD<int>
{ {
bool haveSIMD; bool haveSIMD;
Div_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Div_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const int * src1, const int * src2, int * dst, int width, double scale) const int operator() (const int * src1, const int * src2, int * dst, int width, double scale) const
{ {
@ -1423,7 +1423,7 @@ template <>
struct Div_SIMD<float> struct Div_SIMD<float>
{ {
bool haveSIMD; bool haveSIMD;
Div_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Div_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const float * src1, const float * src2, float * dst, int width, double scale) const int operator() (const float * src1, const float * src2, float * dst, int width, double scale) const
{ {
@ -1463,7 +1463,7 @@ template <>
struct Recip_SIMD<uchar> struct Recip_SIMD<uchar>
{ {
bool haveSIMD; bool haveSIMD;
Recip_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Recip_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const uchar * src2, uchar * dst, int width, double scale) const int operator() (const uchar * src2, uchar * dst, int width, double scale) const
{ {
@ -1504,7 +1504,7 @@ template <>
struct Recip_SIMD<schar> struct Recip_SIMD<schar>
{ {
bool haveSIMD; bool haveSIMD;
Recip_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Recip_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const schar * src2, schar * dst, int width, double scale) const int operator() (const schar * src2, schar * dst, int width, double scale) const
{ {
@ -1545,7 +1545,7 @@ template <>
struct Recip_SIMD<ushort> struct Recip_SIMD<ushort>
{ {
bool haveSIMD; bool haveSIMD;
Recip_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Recip_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const ushort * src2, ushort * dst, int width, double scale) const int operator() (const ushort * src2, ushort * dst, int width, double scale) const
{ {
@ -1585,7 +1585,7 @@ template <>
struct Recip_SIMD<short> struct Recip_SIMD<short>
{ {
bool haveSIMD; bool haveSIMD;
Recip_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Recip_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const short * src2, short * dst, int width, double scale) const int operator() (const short * src2, short * dst, int width, double scale) const
{ {
@ -1625,7 +1625,7 @@ template <>
struct Recip_SIMD<int> struct Recip_SIMD<int>
{ {
bool haveSIMD; bool haveSIMD;
Recip_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Recip_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const int * src2, int * dst, int width, double scale) const int operator() (const int * src2, int * dst, int width, double scale) const
{ {
@ -1665,7 +1665,7 @@ template <>
struct Recip_SIMD<float> struct Recip_SIMD<float>
{ {
bool haveSIMD; bool haveSIMD;
Recip_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Recip_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const float * src2, float * dst, int width, double scale) const int operator() (const float * src2, float * dst, int width, double scale) const
{ {
@ -1702,7 +1702,7 @@ template <>
struct Div_SIMD<double> struct Div_SIMD<double>
{ {
bool haveSIMD; bool haveSIMD;
Div_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Div_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const double * src1, const double * src2, double * dst, int width, double scale) const int operator() (const double * src1, const double * src2, double * dst, int width, double scale) const
{ {
@ -1739,7 +1739,7 @@ template <>
struct Recip_SIMD<double> struct Recip_SIMD<double>
{ {
bool haveSIMD; bool haveSIMD;
Recip_SIMD() { haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); } Recip_SIMD() { haveSIMD = hasSIMD128(); }
int operator() (const double * src2, double * dst, int width, double scale) const int operator() (const double * src2, double * dst, int width, double scale) const
{ {

View File

@ -301,7 +301,7 @@ public:
void operator()(const Range &boundaries) const void operator()(const Range &boundaries) const
{ {
#if CV_SIMD128 #if CV_SIMD128
bool haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); bool haveSIMD = hasSIMD128();
#endif #endif
const int type = src.type(), cn = CV_MAT_CN(type); const int type = src.type(), cn = CV_MAT_CN(type);
@ -709,7 +709,7 @@ public:
uchar* pdst = dst.ptr() + (ptrdiff_t)(dst.step * boundaries.start); uchar* pdst = dst.ptr() + (ptrdiff_t)(dst.step * boundaries.start);
#if CV_SIMD128 #if CV_SIMD128
bool haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); bool haveSIMD = hasSIMD128();
#endif #endif
for (int i = boundaries.start; i < boundaries.end; i++, pmap += mapstep, pdst += dst.step) for (int i = boundaries.start; i < boundaries.end; i++, pmap += mapstep, pdst += dst.step)
@ -962,7 +962,7 @@ static void CannyImpl(Mat& dx, Mat& dy, Mat& dst,
#define CANNY_POP(d) (d) = *--stack_top #define CANNY_POP(d) (d) = *--stack_top
#if CV_SIMD128 #if CV_SIMD128
bool haveSIMD = checkHardwareSupport(CV_CPU_SSE2) || checkHardwareSupport(CV_CPU_NEON); bool haveSIMD = hasSIMD128();
#endif #endif
// calculate magnitude and angle of gradient, perform non-maxima suppression. // calculate magnitude and angle of gradient, perform non-maxima suppression.

View File

@ -130,6 +130,8 @@ void spatialGradient( InputArray _src, OutputArray _dx, OutputArray _dy,
int i_start = 0; int i_start = 0;
int j_start = 0; int j_start = 0;
#if CV_SIMD128 && CV_SSE2 #if CV_SIMD128 && CV_SSE2
if(hasSIMD128())
{
uchar *m_src; uchar *m_src;
short *n_dx, *n_dy; short *n_dx, *n_dy;
@ -266,6 +268,7 @@ void spatialGradient( InputArray _src, OutputArray _dx, OutputArray _dy,
v_store(&n_dy[j+8], v_sdy2); v_store(&n_dy[j+8], v_sdy2);
} }
} }
}
i_start = i; i_start = i;
j_start = j; j_start = j;
#endif #endif