@@ -17,6 +17,10 @@ | |||
#include <avx2intrin.h> | |||
#include <fmaintrin.h> | |||
#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 <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 megdnn | |||
@@ -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 <x86intrin.h> | |||
#ifdef WIN32CMAKE | |||
@@ -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 <x86intrin.h> | |||
#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 megdnn | |||