From 64401dfef088cc1f2cdf9cf02df8c9de227ee9b2 Mon Sep 17 00:00:00 2001 From: Megvii Engine Team Date: Tue, 21 Apr 2020 21:22:45 +0800 Subject: [PATCH] fix(dnn/x86): fix gcc5 -O0 compiler error GitOrigin-RevId: 237e2f27f21c2818f638da24b6efd0465f2dbb8e --- dnn/src/x86/avx_helper.h | 84 +++++++++++++++++++ .../x86/conv_bias/f32/strategy_2x3_8x8.cpp | 2 +- .../x86/conv_bias/f32/strategy_6x3_8x8.cpp | 2 +- dnn/src/x86/simd_helper.h | 76 ----------------- 4 files changed, 86 insertions(+), 78 deletions(-) diff --git a/dnn/src/x86/avx_helper.h b/dnn/src/x86/avx_helper.h index a1a2847f..063ed33c 100644 --- a/dnn/src/x86/avx_helper.h +++ b/dnn/src/x86/avx_helper.h @@ -17,6 +17,10 @@ #include #include +#if !defined (__clang__) +#pragma GCC target ("avx") +#endif + namespace megdnn { namespace x86 { @@ -27,6 +31,86 @@ static inline __m256 _mm256_loadu2_m128_emulate( _mm_loadu_ps(hiaddr), 1); } +template +struct Vector; + +template <> +struct Vector { + __m256 value; + Vector() {} + Vector(const float v) MEGDNN_ATTRIBUTE_TARGET("avx") { + value = _mm256_set1_ps(v); + } + Vector(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { + value = lr.value; + } + Vector(const Vector&& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { + value = std::move(lr.value); + } + Vector(const __m256& v) MEGDNN_ATTRIBUTE_TARGET("avx") { value = v; } + static Vector load(const float* addr) MEGDNN_ATTRIBUTE_TARGET("avx") { + Vector v; + v.value = _mm256_loadu_ps(addr); + return v; + } + static void save(float* addr, const Vector& v) + MEGDNN_ATTRIBUTE_TARGET("avx") { + _mm256_storeu_ps(addr, v.value); + } + void save(float* addr) MEGDNN_ATTRIBUTE_TARGET("avx") { + save(addr, *this); + } + Vector operator+(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { + Vector dst; + dst.value = _mm256_add_ps(value, lr.value); + return dst; + } + Vector& operator+=(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { + value = _mm256_add_ps(value, lr.value); + return *this; + } + Vector operator-(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { + Vector dst; + dst.value = _mm256_sub_ps(value, lr.value); + return dst; + } + Vector& operator-=(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { + value = _mm256_sub_ps(value, lr.value); + return *this; + } + Vector operator*(float lr)MEGDNN_ATTRIBUTE_TARGET("avx") { + Vector dst; + dst.value = _mm256_mul_ps(value, _mm256_set1_ps(lr)); + return dst; + } + Vector operator*(const Vector& lr)MEGDNN_ATTRIBUTE_TARGET("avx") { + Vector dst; + dst.value = _mm256_mul_ps(value, lr.value); + return dst; + } + Vector& operator*=(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { + value = _mm256_mul_ps(value, lr.value); + return *this; + } + Vector& operator=(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { + value = lr.value; + return *this; + } + Vector& operator=(const Vector&& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { + value = std::move(lr.value); + return *this; + } + Vector operator-() MEGDNN_ATTRIBUTE_TARGET("avx") { + Vector dst; + dst.value = -value; + return dst; + } +}; + +#if !defined (__clang__) +#pragma GCC reset_options +#endif + } // namespace x86 } // namespace megdnn diff --git a/dnn/src/x86/conv_bias/f32/strategy_2x3_8x8.cpp b/dnn/src/x86/conv_bias/f32/strategy_2x3_8x8.cpp index 7f9d0f40..a018eb37 100644 --- a/dnn/src/x86/conv_bias/f32/strategy_2x3_8x8.cpp +++ b/dnn/src/x86/conv_bias/f32/strategy_2x3_8x8.cpp @@ -15,7 +15,7 @@ #include "src/fallback/conv_bias/winograd/winograd.h" #include "src/x86/conv_bias/f32/strategy.h" #include "src/x86/elemwise_helper/op_unary.h" -#include "src/x86/simd_helper.h" +#include "src/x86/avx_helper.h" #include #ifdef WIN32CMAKE diff --git a/dnn/src/x86/conv_bias/f32/strategy_6x3_8x8.cpp b/dnn/src/x86/conv_bias/f32/strategy_6x3_8x8.cpp index 280d10a9..62032e4f 100644 --- a/dnn/src/x86/conv_bias/f32/strategy_6x3_8x8.cpp +++ b/dnn/src/x86/conv_bias/f32/strategy_6x3_8x8.cpp @@ -16,7 +16,7 @@ #include "src/fallback/conv_bias/winograd/winograd.h" #include "src/x86/conv_bias/f32/strategy.h" #include "src/x86/elemwise_helper/op_unary.h" -#include "src/x86/simd_helper.h" +#include "src/x86/avx_helper.h" #include #ifdef WIN32CMAKE diff --git a/dnn/src/x86/simd_helper.h b/dnn/src/x86/simd_helper.h index 0b0f9019..ff1bee0d 100644 --- a/dnn/src/x86/simd_helper.h +++ b/dnn/src/x86/simd_helper.h @@ -140,82 +140,6 @@ struct simd_traits: simd_traits_avx_base { } }; -template -struct Vector; - -template <> -struct Vector { - __m256 value; - Vector() {} - Vector(const float v) MEGDNN_ATTRIBUTE_TARGET("avx") { - value = _mm256_set1_ps(v); - } - Vector(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { - value = lr.value; - } - Vector(const Vector&& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { - value = std::move(lr.value); - } - Vector(const __m256& v) MEGDNN_ATTRIBUTE_TARGET("avx") { value = v; } - static Vector load(const float* addr) MEGDNN_ATTRIBUTE_TARGET("avx") { - Vector v; - v.value = _mm256_loadu_ps(addr); - return v; - } - static void save(float* addr, const Vector& v) - MEGDNN_ATTRIBUTE_TARGET("avx") { - _mm256_storeu_ps(addr, v.value); - } - void save(float* addr) MEGDNN_ATTRIBUTE_TARGET("avx") { - save(addr, *this); - } - Vector operator+(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { - Vector dst; - dst.value = _mm256_add_ps(value, lr.value); - return dst; - } - Vector& operator+=(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { - value = _mm256_add_ps(value, lr.value); - return *this; - } - Vector operator-(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { - Vector dst; - dst.value = _mm256_sub_ps(value, lr.value); - return dst; - } - Vector& operator-=(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { - value = _mm256_sub_ps(value, lr.value); - return *this; - } - Vector operator*(float lr)MEGDNN_ATTRIBUTE_TARGET("avx") { - Vector dst; - dst.value = _mm256_mul_ps(value, _mm256_set1_ps(lr)); - return dst; - } - Vector operator*(const Vector& lr)MEGDNN_ATTRIBUTE_TARGET("avx") { - Vector dst; - dst.value = _mm256_mul_ps(value, lr.value); - return dst; - } - Vector& operator*=(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { - value = _mm256_mul_ps(value, lr.value); - return *this; - } - Vector& operator=(const Vector& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { - value = lr.value; - return *this; - } - Vector& operator=(const Vector&& lr) MEGDNN_ATTRIBUTE_TARGET("avx") { - value = std::move(lr.value); - return *this; - } - Vector operator-() MEGDNN_ATTRIBUTE_TARGET("avx") { - Vector dst; - dst.value = -value; - return dst; - } -}; - } // namespace x86 } // namespace megdnn -- GitLab