3#if _MSC_VER >= 1900 && defined(_M_X64)
5#include "BackendBase.h"
14 class FL_EXPORT CTensor;
17 class FL_EXPORT CBackendConv3D :
public CBackendBase<T>
21 CBackendConv3D(
const CBackendConv3D<T>& bc);
22 virtual ~CBackendConv3D();
24 virtual const CResult SetConvolutionParams(
const CConvolution3DParameters& convParams);
25 virtual CConvolution3DParameters GetConvolutionParams();
27 virtual const CResult Forward(CTensor<T>* pTsrX, CTensor<T>* pTsrW, CTensor<T>* pTsrY,
const std::vector<int64_t>& vctYShape);
28 virtual const CResult DerivativeImage(CTensor<T>* pTsrDy, CTensor<T>* pTsrW, CTensor<T>* pTsrDx,
const std::vector<int64_t>& vctDxShape,
bool bAddGradient);
29 virtual const CResult DerivativeKernel(CTensor<T>* pTsrDy, CTensor<T>* pTsrX, CTensor<T>* pTsrDw,
const std::vector<int64_t>& vctDwShape,
bool bAddGradient);
31 DeclareGetClassType();
32 SupportToDuplicateObjectWithoutCreateNewObject(CBackendConv3D<T>, *
this);
35 virtual const CResult Forward_Direct(CTensor<T>* pTsrOperand, CTensor<T>* pTsrKernel, CTensor<T>* pTsrResult);
36 virtual const CResult DerivativeImage_Direct(CTensor<T>* pTsrDy, CTensor<T>* pTsrW, CTensor<T>* pTsrDx,
bool bAddGradient);
37 virtual const CResult DerivativeKernel_Direct(CTensor<T>* pTsrDy, CTensor<T>* pTsrX, CTensor<T>* pTsrDw,
bool bAddGradient);
40 CConvolution3DParameters m_conv3DParams;
47 struct AvxTemplate<float>
50 static constexpr int32_t LANES = 8;
52 static inline Vec zero()
54 return _mm256_setzero_ps();
57 static inline Vec set1(
float f32V)
59 return _mm256_set1_ps(f32V);
62 static inline Vec loadu(
const float* pF32)
64 return _mm256_loadu_ps(pF32);
67 static inline void storeu(
float* pF32, Vec vec)
69 _mm256_storeu_ps(pF32, vec);
72 static inline Vec fmadd(Vec vecA, Vec vecB, Vec vecC)
74 return _mm256_add_ps(vecC, _mm256_mul_ps(vecA, vecB));
77 static inline float hsum(Vec v)
79 alignas(32)
float arrF32Buf[LANES];
80 _mm256_store_ps(arrF32Buf, v);
83 for(
int i = 0; i < LANES; ++i)
84 f32Ret += arrF32Buf[i];
91 struct AvxTemplate<double>
94 static constexpr int32_t LANES = 4;
96 static inline Vec zero()
98 return _mm256_setzero_pd();
101 static inline Vec set1(
double f64V)
103 return _mm256_set1_pd(f64V);
106 static inline Vec loadu(
const double* pF64)
108 return _mm256_loadu_pd(pF64);
111 static inline void storeu(
double* pF64, Vec vec)
113 _mm256_storeu_pd(pF64, vec);
116 static inline Vec fmadd(Vec vecA, Vec vecB, Vec vecC)
118 return _mm256_add_pd(vecC, _mm256_mul_pd(vecA, vecB));
121 static inline double hsum(Vec v)
123 alignas(32)
double arrF64Buf[LANES];
124 _mm256_store_pd(arrF64Buf, v);
127 for(
int i = 0; i < LANES; ++i)
128 f64Ret += arrF64Buf[i];
Definition AlgorithmAIBase.h:18