mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 07:43:03 +04:00
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
This commit is contained in:
@@ -73,8 +73,10 @@
|
||||
@defgroup core_cluster Clustering
|
||||
@defgroup core_utils Utility and system functions and macros
|
||||
@{
|
||||
@defgroup core_logging Logging facilities
|
||||
@defgroup core_utils_sse SSE utilities
|
||||
@defgroup core_utils_neon NEON utilities
|
||||
@defgroup core_utils_vsx VSX utilities
|
||||
@defgroup core_utils_softfloat Softfloat support
|
||||
@defgroup core_utils_samples Utility functions for OpenCV samples
|
||||
@}
|
||||
|
||||
@@ -1039,6 +1039,15 @@ inline v_float64x2 v_cvt_f64(const v_float32x4& a)
|
||||
inline v_float64x2 v_cvt_f64_high(const v_float32x4& a)
|
||||
{ return v_float64x2(vec_cvfo(vec_mergel(a.val, a.val))); }
|
||||
|
||||
// The altivec intrinsic is missing for this 2.06 insn
|
||||
inline v_float64x2 v_cvt_f64(const v_int64x2& a)
|
||||
{
|
||||
vec_double2 out;
|
||||
|
||||
__asm__ ("xvcvsxddp %x0,%x1" : "=wa"(out) : "wa"(a.val));
|
||||
return v_float64x2(out);
|
||||
}
|
||||
|
||||
////////////// Lookup table access ////////////////////
|
||||
|
||||
inline v_int8x16 v_lut(const schar* tab, const int* idx)
|
||||
|
||||
@@ -507,8 +507,8 @@ Special cases:
|
||||
*/
|
||||
CV_EXPORTS softdouble cos( const softdouble& a );
|
||||
|
||||
}
|
||||
//! @} core_utils_softfloat
|
||||
|
||||
//! @}
|
||||
} // cv::
|
||||
|
||||
#endif
|
||||
|
||||
@@ -12,15 +12,13 @@
|
||||
#include "logger.defines.hpp"
|
||||
#include "logtag.hpp"
|
||||
|
||||
//! @addtogroup core_logging
|
||||
// This section describes OpenCV logging utilities.
|
||||
//
|
||||
//! @{
|
||||
|
||||
namespace cv {
|
||||
namespace utils {
|
||||
namespace logging {
|
||||
|
||||
//! @addtogroup core_logging
|
||||
//! @{
|
||||
|
||||
/** Set global logging level
|
||||
@return previous logging level
|
||||
*/
|
||||
@@ -148,8 +146,8 @@ struct LogTagAuto
|
||||
# define CV_LOG_VERBOSE(tag, v, ...)
|
||||
#endif
|
||||
|
||||
}}} // namespace
|
||||
|
||||
//! @}
|
||||
|
||||
}}} // namespace
|
||||
|
||||
#endif // OPENCV_LOGGER_HPP
|
||||
|
||||
@@ -7,15 +7,13 @@
|
||||
|
||||
#include <opencv2/core/cvdef.h>
|
||||
|
||||
//! @addtogroup core_logging
|
||||
// This section describes OpenCV tracing utilities.
|
||||
//
|
||||
//! @{
|
||||
|
||||
namespace cv {
|
||||
namespace utils {
|
||||
namespace trace {
|
||||
|
||||
//! @addtogroup core_logging
|
||||
//! @{
|
||||
|
||||
//! Macro to trace function
|
||||
#define CV_TRACE_FUNCTION()
|
||||
|
||||
@@ -247,8 +245,8 @@ CV_EXPORTS void traceArg(const TraceArg& arg, double value);
|
||||
|
||||
//! @endcond
|
||||
|
||||
}}} // namespace
|
||||
|
||||
//! @}
|
||||
|
||||
}}} // namespace
|
||||
|
||||
#endif // OPENCV_TRACE_HPP
|
||||
|
||||
@@ -2493,7 +2493,36 @@ double dotProd_16s(const short* src1, const short* src2, int len)
|
||||
|
||||
double dotProd_32s(const int* src1, const int* src2, int len)
|
||||
{
|
||||
#if CV_SIMD128_64F
|
||||
double r = 0.0;
|
||||
int i = 0;
|
||||
int lenAligned = len & -v_int32x4::nlanes;
|
||||
v_float64x2 a(0.0, 0.0);
|
||||
v_float64x2 b(0.0, 0.0);
|
||||
|
||||
for( i = 0; i < lenAligned; i += v_int32x4::nlanes )
|
||||
{
|
||||
v_int32x4 s1 = v_load(src1);
|
||||
v_int32x4 s2 = v_load(src2);
|
||||
|
||||
#if CV_VSX
|
||||
// Do 32x32->64 multiplies, convert/round to double, accumulate
|
||||
// Potentially less precise than FMA, but 1.5x faster than fma below.
|
||||
a += v_cvt_f64(v_int64(vec_mule(s1.val, s2.val)));
|
||||
b += v_cvt_f64(v_int64(vec_mulo(s1.val, s2.val)));
|
||||
#else
|
||||
a = v_fma(v_cvt_f64(s1), v_cvt_f64(s2), a);
|
||||
b = v_fma(v_cvt_f64_high(s1), v_cvt_f64_high(s2), b);
|
||||
#endif
|
||||
src1 += v_int32x4::nlanes;
|
||||
src2 += v_int32x4::nlanes;
|
||||
}
|
||||
a += b;
|
||||
r = v_reduce_sum(a);
|
||||
return r + dotProd_(src1, src2, len - i);
|
||||
#else
|
||||
return dotProd_(src1, src2, len);
|
||||
#endif
|
||||
}
|
||||
|
||||
double dotProd_32f(const float* src1, const float* src2, int len)
|
||||
|
||||
+76
-13
@@ -63,7 +63,31 @@ int normHamming(const uchar* a, int n, int cellSize)
|
||||
return -1;
|
||||
int i = 0;
|
||||
int result = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_SIMD
|
||||
v_uint64 t = vx_setzero_u64();
|
||||
if ( cellSize == 2)
|
||||
{
|
||||
v_uint16 mask = v_reinterpret_as_u16(vx_setall_u8(0x55));
|
||||
for(; i <= n - v_uint8::nlanes; i += v_uint8::nlanes)
|
||||
{
|
||||
v_uint16 a0 = v_reinterpret_as_u16(vx_load(a + i));
|
||||
t += v_popcount(v_reinterpret_as_u64((a0 | (a0 >> 1)) & mask));
|
||||
}
|
||||
}
|
||||
else // cellSize == 4
|
||||
{
|
||||
v_uint16 mask = v_reinterpret_as_u16(vx_setall_u8(0x11));
|
||||
for(; i <= n - v_uint8::nlanes; i += v_uint8::nlanes)
|
||||
{
|
||||
v_uint16 a0 = v_reinterpret_as_u16(vx_load(a + i));
|
||||
v_uint16 a1 = a0 | (a0 >> 2);
|
||||
t += v_popcount(v_reinterpret_as_u64((a1 | (a1 >> 1)) & mask));
|
||||
|
||||
}
|
||||
}
|
||||
result += (int)v_reduce_sum(t);
|
||||
vx_cleanup();
|
||||
#elif CV_ENABLE_UNROLLED
|
||||
for( ; i <= n - 4; i += 4 )
|
||||
result += tab[a[i]] + tab[a[i+1]] + tab[a[i+2]] + tab[a[i+3]];
|
||||
#endif
|
||||
@@ -85,7 +109,30 @@ int normHamming(const uchar* a, const uchar* b, int n, int cellSize)
|
||||
return -1;
|
||||
int i = 0;
|
||||
int result = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_SIMD
|
||||
v_uint64 t = vx_setzero_u64();
|
||||
if ( cellSize == 2)
|
||||
{
|
||||
v_uint16 mask = v_reinterpret_as_u16(vx_setall_u8(0x55));
|
||||
for(; i <= n - v_uint8::nlanes; i += v_uint8::nlanes)
|
||||
{
|
||||
v_uint16 ab0 = v_reinterpret_as_u16(vx_load(a + i) ^ vx_load(b + i));
|
||||
t += v_popcount(v_reinterpret_as_u64((ab0 | (ab0 >> 1)) & mask));
|
||||
}
|
||||
}
|
||||
else // cellSize == 4
|
||||
{
|
||||
v_uint16 mask = v_reinterpret_as_u16(vx_setall_u8(0x11));
|
||||
for(; i <= n - v_uint8::nlanes; i += v_uint8::nlanes)
|
||||
{
|
||||
v_uint16 ab0 = v_reinterpret_as_u16(vx_load(a + i) ^ vx_load(b + i));
|
||||
v_uint16 ab1 = ab0 | (ab0 >> 2);
|
||||
t += v_popcount(v_reinterpret_as_u64((ab1 | (ab1 >> 1)) & mask));
|
||||
}
|
||||
}
|
||||
result += (int)v_reduce_sum(t);
|
||||
vx_cleanup();
|
||||
#elif CV_ENABLE_UNROLLED
|
||||
for( ; i <= n - 4; i += 4 )
|
||||
result += tab[a[i] ^ b[i]] + tab[a[i+1] ^ b[i+1]] +
|
||||
tab[a[i+2] ^ b[i+2]] + tab[a[i+3] ^ b[i+3]];
|
||||
@@ -99,13 +146,20 @@ float normL2Sqr_(const float* a, const float* b, int n)
|
||||
{
|
||||
int j = 0; float d = 0.f;
|
||||
#if CV_SIMD
|
||||
v_float32 v_d = vx_setzero_f32();
|
||||
for (; j <= n - v_float32::nlanes; j += v_float32::nlanes)
|
||||
v_float32 v_d0 = vx_setzero_f32(), v_d1 = vx_setzero_f32();
|
||||
v_float32 v_d2 = vx_setzero_f32(), v_d3 = vx_setzero_f32();
|
||||
for (; j <= n - 4 * v_float32::nlanes; j += 4 * v_float32::nlanes)
|
||||
{
|
||||
v_float32 t = vx_load(a + j) - vx_load(b + j);
|
||||
v_d = v_muladd(t, t, v_d);
|
||||
v_float32 t0 = vx_load(a + j) - vx_load(b + j);
|
||||
v_float32 t1 = vx_load(a + j + v_float32::nlanes) - vx_load(b + j + v_float32::nlanes);
|
||||
v_float32 t2 = vx_load(a + j + 2 * v_float32::nlanes) - vx_load(b + j + 2 * v_float32::nlanes);
|
||||
v_float32 t3 = vx_load(a + j + 3 * v_float32::nlanes) - vx_load(b + j + 3 * v_float32::nlanes);
|
||||
v_d0 = v_muladd(t0, t0, v_d0);
|
||||
v_d1 = v_muladd(t1, t1, v_d1);
|
||||
v_d2 = v_muladd(t2, t2, v_d2);
|
||||
v_d3 = v_muladd(t3, t3, v_d3);
|
||||
}
|
||||
d = v_reduce_sum(v_d);
|
||||
d = v_reduce_sum(v_d0 + v_d1 + v_d2 + v_d3);
|
||||
#endif
|
||||
for( ; j < n; j++ )
|
||||
{
|
||||
@@ -120,10 +174,16 @@ float normL1_(const float* a, const float* b, int n)
|
||||
{
|
||||
int j = 0; float d = 0.f;
|
||||
#if CV_SIMD
|
||||
v_float32 v_d = vx_setzero_f32();
|
||||
for (; j <= n - v_float32::nlanes; j += v_float32::nlanes)
|
||||
v_d += v_absdiff(vx_load(a + j), vx_load(b + j));
|
||||
d = v_reduce_sum(v_d);
|
||||
v_float32 v_d0 = vx_setzero_f32(), v_d1 = vx_setzero_f32();
|
||||
v_float32 v_d2 = vx_setzero_f32(), v_d3 = vx_setzero_f32();
|
||||
for (; j <= n - 4 * v_float32::nlanes; j += 4 * v_float32::nlanes)
|
||||
{
|
||||
v_d0 += v_absdiff(vx_load(a + j), vx_load(b + j));
|
||||
v_d1 += v_absdiff(vx_load(a + j + v_float32::nlanes), vx_load(b + j + v_float32::nlanes));
|
||||
v_d2 += v_absdiff(vx_load(a + j + 2 * v_float32::nlanes), vx_load(b + j + 2 * v_float32::nlanes));
|
||||
v_d3 += v_absdiff(vx_load(a + j + 3 * v_float32::nlanes), vx_load(b + j + 3 * v_float32::nlanes));
|
||||
}
|
||||
d = v_reduce_sum(v_d0 + v_d1 + v_d2 + v_d3);
|
||||
#endif
|
||||
for( ; j < n; j++ )
|
||||
d += std::abs(a[j] - b[j]);
|
||||
@@ -134,8 +194,11 @@ int normL1_(const uchar* a, const uchar* b, int n)
|
||||
{
|
||||
int j = 0, d = 0;
|
||||
#if CV_SIMD
|
||||
for (; j <= n - v_uint8::nlanes; j += v_uint8::nlanes)
|
||||
d += v_reduce_sad(vx_load(a + j), vx_load(b + j));
|
||||
for (; j <= n - 4 * v_uint8::nlanes; j += 4 * v_uint8::nlanes)
|
||||
d += v_reduce_sad(vx_load(a + j), vx_load(b + j)) +
|
||||
v_reduce_sad(vx_load(a + j + v_uint8::nlanes), vx_load(b + j + v_uint8::nlanes)) +
|
||||
v_reduce_sad(vx_load(a + j + 2 * v_uint8::nlanes), vx_load(b + j + 2 * v_uint8::nlanes)) +
|
||||
v_reduce_sad(vx_load(a + j + 3 * v_uint8::nlanes), vx_load(b + j + 3 * v_uint8::nlanes));
|
||||
#endif
|
||||
for( ; j < n; j++ )
|
||||
d += std::abs(a[j] - b[j]);
|
||||
|
||||
@@ -536,9 +536,9 @@ __kernel void fft_multi_radix_rows(__global const uchar* src_ptr, int src_step,
|
||||
const int x = get_global_id(0);
|
||||
const int y = get_group_id(1);
|
||||
const int block_size = LOCAL_SIZE/kercn;
|
||||
__local CT smem[LOCAL_SIZE]; // used in (y < nz) code branch only, but should be declared in the outermost scope of a kernel function
|
||||
if (y < nz)
|
||||
{
|
||||
__local CT smem[LOCAL_SIZE];
|
||||
__global const CT* twiddles = (__global const CT*)(twiddles_ptr + twiddles_offset);
|
||||
const int ind = x;
|
||||
#ifdef IS_1D
|
||||
@@ -615,9 +615,9 @@ __kernel void fft_multi_radix_cols(__global const uchar* src_ptr, int src_step,
|
||||
const int x = get_group_id(0);
|
||||
const int y = get_global_id(1);
|
||||
|
||||
__local CT smem[LOCAL_SIZE]; // used in (x < nz) code branch only, but should be declared in the outermost scope of a kernel function
|
||||
if (x < nz)
|
||||
{
|
||||
__local CT smem[LOCAL_SIZE];
|
||||
__global const uchar* src = src_ptr + mad24(y, src_step, mad24(x, (int)(sizeof(CT)), src_offset));
|
||||
__global const CT* twiddles = (__global const CT*)(twiddles_ptr + twiddles_offset);
|
||||
const int ind = y;
|
||||
@@ -682,9 +682,9 @@ __kernel void ifft_multi_radix_rows(__global const uchar* src_ptr, int src_step,
|
||||
const FT scale = (FT) 1/(dst_cols*dst_rows);
|
||||
#endif
|
||||
|
||||
__local CT smem[LOCAL_SIZE]; // used in (y < nz) code branch only, but should be declared in the outermost scope of a kernel function
|
||||
if (y < nz)
|
||||
{
|
||||
__local CT smem[LOCAL_SIZE];
|
||||
__global const CT* twiddles = (__global const CT*)(twiddles_ptr + twiddles_offset);
|
||||
const int ind = x;
|
||||
|
||||
@@ -782,10 +782,10 @@ __kernel void ifft_multi_radix_cols(__global const uchar* src_ptr, int src_step,
|
||||
const int x = get_group_id(0);
|
||||
const int y = get_global_id(1);
|
||||
|
||||
#ifdef COMPLEX_INPUT
|
||||
__local CT smem[LOCAL_SIZE]; // used in (x < nz) code branch only, but should be declared in the outermost scope of a kernel function
|
||||
if (x < nz)
|
||||
{
|
||||
__local CT smem[LOCAL_SIZE];
|
||||
#ifdef COMPLEX_INPUT
|
||||
__global const uchar* src = src_ptr + mad24(y, src_step, mad24(x, (int)(sizeof(CT)), src_offset));
|
||||
__global uchar* dst = dst_ptr + mad24(y, dst_step, mad24(x, (int)(sizeof(CT)), dst_offset));
|
||||
__global const CT* twiddles = (__global const CT*)(twiddles_ptr + twiddles_offset);
|
||||
@@ -812,15 +812,11 @@ __kernel void ifft_multi_radix_cols(__global const uchar* src_ptr, int src_step,
|
||||
res[0].x = smem[y + i*block_size].x;
|
||||
res[0].y = -smem[y + i*block_size].y;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (x < nz)
|
||||
{
|
||||
__global const CT* twiddles = (__global const CT*)(twiddles_ptr + twiddles_offset);
|
||||
const int ind = y;
|
||||
const int block_size = LOCAL_SIZE/kercn;
|
||||
|
||||
__local CT smem[LOCAL_SIZE];
|
||||
#ifdef EVEN
|
||||
if (x!=0 && (x!=(nz-1)))
|
||||
#else
|
||||
@@ -877,6 +873,6 @@ __kernel void ifft_multi_radix_cols(__global const uchar* src_ptr, int src_step,
|
||||
res[0].x = smem[y + i*block_size].x;
|
||||
res[0].y = -smem[y + i*block_size].y;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ static void* WinGetProcAddress(const char* name)
|
||||
#define CV_CL_GET_PROC_ADDRESS(name) WinGetProcAddress(name)
|
||||
#endif // _WIN32
|
||||
|
||||
#if defined(__linux__)
|
||||
#if defined(__linux__) || defined(__FreeBSD__)
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ int normHamming(const uchar* a, int n)
|
||||
for (; i <= n - v_uint8::nlanes; i += v_uint8::nlanes)
|
||||
t += v_popcount(v_reinterpret_as_u64(vx_load(a + i)));
|
||||
result = (int)v_reduce_sum(t);
|
||||
vx_cleanup();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user