[opencv] 53/251: dnn: cleanup dispatched code, fix SIMD128 types
Nobuhiro Iwamatsu
iwamatsu at moszumanska.debian.org
Sun Aug 27 23:27:23 UTC 2017
This is an automated email from the git hooks/post-receive script.
iwamatsu pushed a commit to annotated tag 3.3.0
in repository opencv.
commit 4784c7be5fc313e173f7fff83b85e62a002768ed
Author: Alexander Alekhin <alexander.alekhin at intel.com>
Date: Thu Jul 13 18:42:36 2017 +0300
dnn: cleanup dispatched code, fix SIMD128 types
---
modules/dnn/CMakeLists.txt | 2 +
modules/dnn/src/layers/convolution_layer.cpp | 8 ++--
modules/dnn/src/layers/fully_connected_layer.cpp | 12 +++---
modules/dnn/src/layers/layers_common.avx.cpp | 54 ------------------------
modules/dnn/src/layers/layers_common.avx2.cpp | 51 ----------------------
modules/dnn/src/layers/layers_common.hpp | 30 ++-----------
modules/dnn/src/layers/layers_common.simd.hpp | 48 ++++++++++++++-------
7 files changed, 49 insertions(+), 156 deletions(-)
diff --git a/modules/dnn/CMakeLists.txt b/modules/dnn/CMakeLists.txt
index e0d3b95..8b335ad 100644
--- a/modules/dnn/CMakeLists.txt
+++ b/modules/dnn/CMakeLists.txt
@@ -9,6 +9,8 @@ endif()
set(the_description "Deep neural network module. It allows to load models from different frameworks and to make forward pass")
+ocv_add_dispatched_file("layers/layers_common" AVX AVX2)
+
ocv_add_module(dnn opencv_core opencv_imgproc WRAP python matlab java)
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-shadow -Wno-parentheses -Wmaybe-uninitialized -Wsign-promo
-Wmissing-declarations -Wmissing-prototypes
diff --git a/modules/dnn/src/layers/convolution_layer.cpp b/modules/dnn/src/layers/convolution_layer.cpp
index 12e38c5..6e09c8c 100644
--- a/modules/dnn/src/layers/convolution_layer.cpp
+++ b/modules/dnn/src/layers/convolution_layer.cpp
@@ -506,13 +506,13 @@ public:
int bsz = ofs1 - ofs0;
#if CV_TRY_AVX2
if(useAVX2)
- fastConv_avx2(wptr, wstep, biasptr, rowbuf0, data_out0 + ofs0,
+ opt_AVX2::fastConv(wptr, wstep, biasptr, rowbuf0, data_out0 + ofs0,
outShape, bsz, vsz, vsz_a, relu, cn0 == 0);
else
#endif
#if CV_TRY_AVX
if(useAVX)
- fastConv_avx(wptr, wstep, biasptr, rowbuf0, data_out0 + ofs0,
+ opt_AVX::fastConv(wptr, wstep, biasptr, rowbuf0, data_out0 + ofs0,
outShape, bsz, vsz, vsz_a, relu, cn0 == 0);
else
#endif
@@ -824,12 +824,12 @@ public:
#if CV_TRY_AVX2
if( useAVX2 )
- fastGEMM_avx2( aptr, astep, bptr, bstep, cptr, cstep, mmax, kmax, nmax );
+ opt_AVX2::fastGEMM( aptr, astep, bptr, bstep, cptr, cstep, mmax, kmax, nmax );
else
#endif
#if CV_TRY_AVX
if( useAVX )
- fastGEMM_avx( aptr, astep, bptr, bstep, cptr, cstep, mmax, kmax, nmax );
+ opt_AVX::fastGEMM( aptr, astep, bptr, bstep, cptr, cstep, mmax, kmax, nmax );
else
#endif
for( m = 0; m < mmax; m += 2 )
diff --git a/modules/dnn/src/layers/fully_connected_layer.cpp b/modules/dnn/src/layers/fully_connected_layer.cpp
index f27f39c..9bec3b0 100644
--- a/modules/dnn/src/layers/fully_connected_layer.cpp
+++ b/modules/dnn/src/layers/fully_connected_layer.cpp
@@ -177,12 +177,12 @@ public:
#if CV_TRY_AVX2
if( useAVX2 )
- fastGEMM1T_avx2( sptr, wptr, wstep, biasptr, dptr, nw, vecsize);
+ opt_AVX2::fastGEMM1T( sptr, wptr, wstep, biasptr, dptr, nw, vecsize);
else
#endif
#if CV_TRY_AVX
if( useAVX )
- fastGEMM1T_avx( sptr, wptr, wstep, biasptr, dptr, nw, vecsize);
+ opt_AVX::fastGEMM1T( sptr, wptr, wstep, biasptr, dptr, nw, vecsize);
else
#endif
{
@@ -191,19 +191,19 @@ public:
#if CV_SIMD128
for( ; i <= nw - 4; i += 4, wptr += 4*wstep )
{
- vfloat32x4 vs0 = v_setall_f32(0.f), vs1 = v_setall_f32(0.f);
- vfloat32x4 vs2 = v_setall_f32(0.f), vs3 = v_setall_f32(0.f);
+ v_float32x4 vs0 = v_setall_f32(0.f), vs1 = v_setall_f32(0.f);
+ v_float32x4 vs2 = v_setall_f32(0.f), vs3 = v_setall_f32(0.f);
for( k = 0; k < vecsize; k += 4 )
{
- vfloat32x4 v = v_load_aligned(sptr + k);
+ v_float32x4 v = v_load_aligned(sptr + k);
vs0 += v*v_load_aligned(wptr + k);
vs1 += v*v_load_aligned(wptr + wstep + k);
vs2 += v*v_load_aligned(wptr + wstep*2 + k);
vs3 += v*v_load_aligned(wptr + wstep*3 + k);
}
- vfloat32x4 s = v_reduce_sum4(vs0, vs1, vs2, vs3);
+ v_float32x4 s = v_reduce_sum4(vs0, vs1, vs2, vs3);
s += v_load(biasptr + i);
v_store(dptr + i, s);
}
diff --git a/modules/dnn/src/layers/layers_common.avx.cpp b/modules/dnn/src/layers/layers_common.avx.cpp
deleted file mode 100644
index 4e0c034..0000000
--- a/modules/dnn/src/layers/layers_common.avx.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*M///////////////////////////////////////////////////////////////////////////////////////
-//
-// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
-//
-// By downloading, copying, installing or using the software you agree to this license.
-// If you do not agree to this license, do not download, install,
-// copy or use the software.
-//
-//
-// License Agreement
-// For Open Source Computer Vision Library
-//
-// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
-// Copyright (C) 2017, Intel Corporation, all rights reserved.
-// Third party copyrights are property of their respective owners.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// * Redistribution's of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Redistribution's in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// * The name of the copyright holders may not be used to endorse or promote products
-// derived from this software without specific prior written permission.
-//
-// This software is provided by the copyright holders and contributors "as is" and
-// any express or implied warranties, including, but not limited to, the implied
-// warranties of merchantability and fitness for a particular purpose are disclaimed.
-// In no event shall the Intel Corporation or contributors be liable for any direct,
-// indirect, incidental, special, exemplary, or consequential damages
-// (including, but not limited to, procurement of substitute goods or services;
-// loss of use, data, or profits; or business interruption) however caused
-// and on any theory of liability, whether in contract, strict liability,
-// or tort (including negligence or otherwise) arising in any way out of
-// the use of this software, even if advised of the possibility of such damage.
-//
-//M*/
-
-#include "precomp.hpp"
-#include "layers_common.hpp"
-#include "opencv2/core/hal/intrin.hpp"
-
-#define fastConv_some_avx fastConv_avx
-#define fastGEMM1T_some_avx fastGEMM1T_avx
-#define fastGEMM_some_avx fastGEMM_avx
-
-#undef _mm256_fmadd_ps
-#define _mm256_fmadd_ps(a, b, c) _mm256_add_ps(c, _mm256_mul_ps(a, b))
-
-#include "layers_common.simd.hpp"
diff --git a/modules/dnn/src/layers/layers_common.avx2.cpp b/modules/dnn/src/layers/layers_common.avx2.cpp
deleted file mode 100644
index ef8108c..0000000
--- a/modules/dnn/src/layers/layers_common.avx2.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*M///////////////////////////////////////////////////////////////////////////////////////
-//
-// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
-//
-// By downloading, copying, installing or using the software you agree to this license.
-// If you do not agree to this license, do not download, install,
-// copy or use the software.
-//
-//
-// License Agreement
-// For Open Source Computer Vision Library
-//
-// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
-// Copyright (C) 2017, Intel Corporation, all rights reserved.
-// Third party copyrights are property of their respective owners.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// * Redistribution's of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Redistribution's in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// * The name of the copyright holders may not be used to endorse or promote products
-// derived from this software without specific prior written permission.
-//
-// This software is provided by the copyright holders and contributors "as is" and
-// any express or implied warranties, including, but not limited to, the implied
-// warranties of merchantability and fitness for a particular purpose are disclaimed.
-// In no event shall the Intel Corporation or contributors be liable for any direct,
-// indirect, incidental, special, exemplary, or consequential damages
-// (including, but not limited to, procurement of substitute goods or services;
-// loss of use, data, or profits; or business interruption) however caused
-// and on any theory of liability, whether in contract, strict liability,
-// or tort (including negligence or otherwise) arising in any way out of
-// the use of this software, even if advised of the possibility of such damage.
-//
-//M*/
-
-#include "precomp.hpp"
-#include "layers_common.hpp"
-#include "opencv2/core/hal/intrin.hpp"
-
-#define fastConv_some_avx fastConv_avx2
-#define fastGEMM1T_some_avx fastGEMM1T_avx2
-#define fastGEMM_some_avx fastGEMM_avx2
-
-#include "layers_common.simd.hpp"
diff --git a/modules/dnn/src/layers/layers_common.hpp b/modules/dnn/src/layers/layers_common.hpp
index bbab275..f34646a 100644
--- a/modules/dnn/src/layers/layers_common.hpp
+++ b/modules/dnn/src/layers/layers_common.hpp
@@ -45,6 +45,10 @@
#include <opencv2/dnn.hpp>
#include <opencv2/dnn/shape_utils.hpp>
+// dispatched AVX/AVX2 optimizations
+#include "layers/layers_common.simd.hpp"
+#include "layers/layers_common.simd_declarations.hpp"
+
namespace cv
{
namespace dnn
@@ -64,32 +68,6 @@ void getConvPoolPaddings(const Size& inp, const Size& out,
const Size &kernel, const Size &stride,
const String &padMode, Size &pad);
-#if CV_TRY_AVX
-void fastConv_avx(const float* weights, size_t wstep, const float* bias,
- const float* rowbuf, float* output, const int* outShape,
- int blockSize, int vecsize, int vecsize_aligned,
- const float* relu, bool initOutput);
-void fastGEMM1T_avx( const float* vec, const float* weights,
- size_t wstep, const float* bias,
- float* dst, int nvecs, int vecsize );
-void fastGEMM_avx( const float* aptr, size_t astep, const float* bptr0,
- size_t bstep, float* cptr, size_t cstep,
- int ma, int na, int nb );
-#endif
-
-#if CV_TRY_AVX2
-void fastConv_avx2(const float* weights, size_t wstep, const float* bias,
- const float* rowbuf, float* output, const int* outShape,
- int blockSize, int vecsize, int vecsize_aligned,
- const float* relu, bool initOutput);
-void fastGEMM1T_avx2( const float* vec, const float* weights,
- size_t wstep, const float* bias,
- float* dst, int nvecs, int vecsize );
-void fastGEMM_avx2( const float* aptr, size_t astep, const float* bptr0,
- size_t bstep, float* cptr, size_t cstep,
- int ma, int na, int nb );
-#endif
-
}
}
diff --git a/modules/dnn/src/layers/layers_common.simd.hpp b/modules/dnn/src/layers/layers_common.simd.hpp
index 1110ed0..9890587 100644
--- a/modules/dnn/src/layers/layers_common.simd.hpp
+++ b/modules/dnn/src/layers/layers_common.simd.hpp
@@ -40,16 +40,34 @@
//
//M*/
-#ifndef __DNN_LAYERS_COMMON_SIMD_HPP__
-#define __DNN_LAYERS_COMMON_SIMD_HPP__
+#include "opencv2/core/hal/intrin.hpp"
namespace cv {
namespace dnn {
+CV_CPU_OPTIMIZATION_NAMESPACE_BEGIN
+
+void fastConv( const float* weights, size_t wstep, const float* bias,
+ const float* rowbuf, float* output, const int* outShape,
+ int blockSize, int vecsize, int vecsize_aligned,
+ const float* relu, bool initOutput );
+void fastGEMM1T( const float* vec, const float* weights,
+ size_t wstep, const float* bias,
+ float* dst, int nvecs, int vecsize );
+void fastGEMM( const float* aptr, size_t astep, const float* bptr,
+ size_t bstep, float* cptr, size_t cstep,
+ int ma, int na, int nb );
+
+#if !defined(CV_CPU_OPTIMIZATION_DECLARATIONS_ONLY) && CV_AVX
+
+#if !CV_FMA // AVX workaround
+#undef _mm256_fmadd_ps
+#define _mm256_fmadd_ps(a, b, c) _mm256_add_ps(c, _mm256_mul_ps(a, b))
+#endif
-void fastConv_some_avx( const float* weights, size_t wstep, const float* bias,
- const float* rowbuf, float* output, const int* outShape,
- int blockSize, int vecsize, int vecsize_aligned,
- const float* relu, bool initOutput )
+void fastConv( const float* weights, size_t wstep, const float* bias,
+ const float* rowbuf, float* output, const int* outShape,
+ int blockSize, int vecsize, int vecsize_aligned,
+ const float* relu, bool initOutput )
{
int outCn = outShape[1];
size_t outPlaneSize = outShape[2]*outShape[3];
@@ -214,9 +232,9 @@ void fastConv_some_avx( const float* weights, size_t wstep, const float* bias,
}
// dst = vec * weights^t + bias
-void fastGEMM1T_some_avx( const float* vec, const float* weights,
- size_t wstep, const float* bias,
- float* dst, int nvecs, int vecsize )
+void fastGEMM1T( const float* vec, const float* weights,
+ size_t wstep, const float* bias,
+ float* dst, int nvecs, int vecsize )
{
int i = 0;
@@ -276,9 +294,9 @@ void fastGEMM1T_some_avx( const float* vec, const float* weights,
_mm256_zeroupper();
}
-void fastGEMM_some_avx( const float* aptr, size_t astep, const float* bptr,
- size_t bstep, float* cptr, size_t cstep,
- int ma, int na, int nb )
+void fastGEMM( const float* aptr, size_t astep, const float* bptr,
+ size_t bstep, float* cptr, size_t cstep,
+ int ma, int na, int nb )
{
int n = 0;
for( ; n <= nb - 16; n += 16 )
@@ -346,7 +364,7 @@ void fastGEMM_some_avx( const float* aptr, size_t astep, const float* bptr,
_mm256_zeroupper();
}
-}
-}
+#endif // CV_CPU_OPTIMIZATION_DECLARATIONS_ONLY
-#endif
+CV_CPU_OPTIMIZATION_NAMESPACE_END
+}} // namespace
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/opencv.git
More information about the debian-science-commits
mailing list