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  }