gitee.com/quant1x/gox@v1.7.6/num/asm/_cpp/aggregates.cpp (about) 1 #include <cstddef> 2 3 template<typename T> 4 T Sum(T* __restrict x, size_t n) { 5 T sum = 0; 6 for (size_t i = 0; i < n; i++) { 7 sum += x[i]; 8 } 9 return sum; 10 } 11 12 template<typename T> 13 void CumSum(T* __restrict x, size_t n) { // not vectorized 14 T sum = 0; 15 for (size_t i = 0; i < n; i++) { 16 sum += x[i]; 17 x[i] = sum; 18 } 19 } 20 21 template<typename T> 22 T Prod(T* __restrict x, size_t n) { 23 T prod = 1; 24 for (size_t i = 0; i < n; i++) { 25 prod *= x[i]; 26 } 27 return prod; 28 } 29 30 template<typename T> 31 void CumProd(T* __restrict x, size_t n) { // not vectorized 32 T prod = 1; 33 for (size_t i = 0; i < n; i++) { 34 prod *= x[i]; 35 x[i] = prod; 36 } 37 } 38 39 double Sum_F64_D(double* x, size_t n) { 40 return Sum(x, n); 41 } 42 43 float Sum_F32_F(float* x, size_t n) { 44 return Sum(x, n); 45 } 46 47 void CumSum_F64_V(double* x, size_t n) { 48 return CumSum(x, n); 49 } 50 51 void CumSum_F32_V(float* x, size_t n) { 52 return CumSum(x, n); 53 } 54 55 double Prod_F64_D(double* x, size_t n) { 56 return Prod(x, n); 57 } 58 59 float Prod_F32_F(float* x, size_t n) { 60 return Prod(x, n); 61 } 62 63 void CumProd_F64_V(double* x, size_t n) { 64 return CumProd(x, n); 65 } 66 67 void CumProd_F32_V(float* x, size_t n) { 68 return CumProd(x, n); 69 }