mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 07:43:03 +04:00
Merge branch 4.x
This commit is contained in:
@@ -1852,6 +1852,7 @@ void convBlockMR1_F32(int np, const float* a, const float* b, float *c, const fl
|
||||
}
|
||||
|
||||
#if CV_SIMD128
|
||||
#if CONV_NR_FP32 > 8
|
||||
static inline void convBlock4x24(int np, const float* a, const float* b, float* c, int ldc, bool init_c, const int convMR, const int convNR)
|
||||
{
|
||||
v_float32x4 c0 = v_setzero_f32(), c1 = c0, c2 = c0, c3 = c0, c4 = c0, c5 = c0;
|
||||
@@ -1956,6 +1957,7 @@ static inline void convBlock4x24(int np, const float* a, const float* b, float*
|
||||
v_store(c + ldc * 3 + 16, c22);
|
||||
v_store(c + ldc * 3 + 20, c23);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void convBlock4x8(int np, const float* a, const float* b, float* c, int ldc, bool init_c, const int convMR, const int convNR)
|
||||
{
|
||||
@@ -2084,11 +2086,13 @@ void convBlock_F32(int np, const float* a, const float* b, float* c, int ldc, bo
|
||||
// The possible outLen range is [24, 8~1].
|
||||
#if CV_SIMD128
|
||||
CV_Assert(convMR == 4);
|
||||
#if CONV_NR_FP32 > 8
|
||||
if (outLen > 8 && convNR == 24)
|
||||
{
|
||||
convBlock4x24(np, a, b, c, ldc, init_c, convMR, convNR);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (outLen <= 8 && outLen > 4)
|
||||
{
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
#elif CV_NEON // 16 registers.
|
||||
#define CONV_MR_FP32 4
|
||||
#define CONV_NR_FP32 12
|
||||
#elif CV_WASM_SIMD
|
||||
#define CONV_MR_FP32 4
|
||||
#define CONV_NR_FP32 8
|
||||
#else // SIMD 128, AVX or AVX2
|
||||
#define CONV_MR_FP32 4
|
||||
#define CONV_NR_FP32 24
|
||||
|
||||
@@ -48,7 +48,16 @@ void softmax(Mat &dst, const Mat &src, int axis, int axisBias, int axisStep){
|
||||
size_t innerDim = i % innerSize;
|
||||
size_t srcOffset = outerDim * outerStep + innerDim;
|
||||
// copy data from src to buf along axis, since the data may not be continuous
|
||||
for (size_t _cnDim = 0; _cnDim < axisStep; _cnDim++)
|
||||
size_t _cnDim = 0;
|
||||
#if CV_ENABLE_UNROLLED && defined(_M_ARM64)
|
||||
for (; _cnDim + 3 < axisStep; _cnDim += 4) {
|
||||
axisBuf[_cnDim + 0] = srcPtr[srcOffset + (_cnDim + 0 + axisBias) * cnStep];
|
||||
axisBuf[_cnDim + 1] = srcPtr[srcOffset + (_cnDim + 1 + axisBias) * cnStep];
|
||||
axisBuf[_cnDim + 2] = srcPtr[srcOffset + (_cnDim + 2 + axisBias) * cnStep];
|
||||
axisBuf[_cnDim + 3] = srcPtr[srcOffset + (_cnDim + 3 + axisBias) * cnStep];
|
||||
}
|
||||
#endif
|
||||
for (; _cnDim < axisStep; _cnDim++)
|
||||
axisBuf[_cnDim] = srcPtr[srcOffset + (_cnDim + axisBias) * cnStep];
|
||||
|
||||
float maxVal = -FLT_MAX;
|
||||
@@ -95,7 +104,16 @@ void softmax(Mat &dst, const Mat &src, int axis, int axisBias, int axisStep){
|
||||
s = 1.f / s;
|
||||
|
||||
// copy back the result to src
|
||||
for (size_t _cnDim = 0; _cnDim < axisStep; _cnDim++)
|
||||
_cnDim = 0;
|
||||
#if CV_ENABLE_UNROLLED && defined(_M_ARM64)
|
||||
for (; _cnDim + 3 < axisStep; _cnDim += 4) {
|
||||
dstPtr[srcOffset + (_cnDim + 0 + axisBias) * cnStep] = axisBuf[_cnDim + 0] * s;
|
||||
dstPtr[srcOffset + (_cnDim + 1 + axisBias) * cnStep] = axisBuf[_cnDim + 1] * s;
|
||||
dstPtr[srcOffset + (_cnDim + 2 + axisBias) * cnStep] = axisBuf[_cnDim + 2] * s;
|
||||
dstPtr[srcOffset + (_cnDim + 3 + axisBias) * cnStep] = axisBuf[_cnDim + 3] * s;
|
||||
}
|
||||
#endif
|
||||
for (; _cnDim < axisStep; _cnDim++)
|
||||
dstPtr[srcOffset + (_cnDim + axisBias) * cnStep] = axisBuf[_cnDim] * s;
|
||||
}
|
||||
}, nstripes);
|
||||
|
||||
Reference in New Issue
Block a user