| @@ -17,6 +17,10 @@ | |||||
| #include <avx2intrin.h> | #include <avx2intrin.h> | ||||
| #include <fmaintrin.h> | #include <fmaintrin.h> | ||||
| #if !defined (__clang__) | |||||
| #pragma GCC target ("avx") | |||||
| #endif | |||||
| namespace megdnn { | namespace megdnn { | ||||
| namespace x86 { | namespace x86 { | ||||
| @@ -27,6 +31,86 @@ static inline __m256 _mm256_loadu2_m128_emulate( | |||||
| _mm_loadu_ps(hiaddr), 1); | _mm_loadu_ps(hiaddr), 1); | ||||
| } | } | ||||
| template <typename ctype, size_t len> | |||||
| struct Vector; | |||||
| template <> | |||||
| struct Vector<float, 8> { | |||||
| __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 x86 | ||||
| } // namespace megdnn | } // namespace megdnn | ||||
| @@ -15,7 +15,7 @@ | |||||
| #include "src/fallback/conv_bias/winograd/winograd.h" | #include "src/fallback/conv_bias/winograd/winograd.h" | ||||
| #include "src/x86/conv_bias/f32/strategy.h" | #include "src/x86/conv_bias/f32/strategy.h" | ||||
| #include "src/x86/elemwise_helper/op_unary.h" | #include "src/x86/elemwise_helper/op_unary.h" | ||||
| #include "src/x86/simd_helper.h" | |||||
| #include "src/x86/avx_helper.h" | |||||
| #include <x86intrin.h> | #include <x86intrin.h> | ||||
| #ifdef WIN32CMAKE | #ifdef WIN32CMAKE | ||||
| @@ -16,7 +16,7 @@ | |||||
| #include "src/fallback/conv_bias/winograd/winograd.h" | #include "src/fallback/conv_bias/winograd/winograd.h" | ||||
| #include "src/x86/conv_bias/f32/strategy.h" | #include "src/x86/conv_bias/f32/strategy.h" | ||||
| #include "src/x86/elemwise_helper/op_unary.h" | #include "src/x86/elemwise_helper/op_unary.h" | ||||
| #include "src/x86/simd_helper.h" | |||||
| #include "src/x86/avx_helper.h" | |||||
| #include <x86intrin.h> | #include <x86intrin.h> | ||||
| #ifdef WIN32CMAKE | #ifdef WIN32CMAKE | ||||
| @@ -140,82 +140,6 @@ struct simd_traits<SIMDType::FMA>: simd_traits_avx_base { | |||||
| } | } | ||||
| }; | }; | ||||
| template <typename ctype, size_t len> | |||||
| struct Vector; | |||||
| template <> | |||||
| struct Vector<float, 8> { | |||||
| __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 x86 | ||||
| } // namespace megdnn | } // namespace megdnn | ||||