32 #ifndef VSMC_MATH_CBLAS_HPP
33 #define VSMC_MATH_CBLAS_HPP
39 #if VSMC_USE_MKL_CBLAS
41 #define VSMC_CBLAS_INT MKL_INT
42 #elif VSMC_USE_VECLIB_CBLAS
43 #include <Accelerate/Accelerate.h>
44 #define VSMC_CBLAS_INT int
50 #ifndef VSMC_CBLAS_THRESHOLD
51 #define VSMC_CBLAS_THRESHOLD 1000
61 inline T
asum (std::size_t n,
const T *x)
66 for (std::size_t i = 0; i != n; ++i)
75 inline T
dot (std::size_t n,
const T *x,
const T *y)
76 {
return std::inner_product(x, x + n, y, static_cast<T>(0));}
80 inline void scal (std::size_t n, T a, T *x)
82 for (std::size_t i = 0; i != n; ++i)
92 #define VSMC_DEFINE_MATH_CBLAS_S1(name, sname, dname) \
93 inline float name (std::size_t n, const float *x) \
95 return n < VSMC_CBLAS_THRESHOLD ? \
97 ::cblas_##sname(static_cast<VSMC_CBLAS_INT>(n), x, 1); \
99 inline double name (std::size_t n, const double *x) \
101 return n < VSMC_CBLAS_THRESHOLD ? \
102 name<double>(n, x): \
103 ::cblas_##dname(static_cast<VSMC_CBLAS_INT>(n), x, 1); \
106 #define VSMC_DEFINE_MATH_CBLAS_S2(name, sname, dname) \
107 inline float name (std::size_t n, const float *x, const float *y) \
109 return n < VSMC_CBLAS_THRESHOLD ? \
110 name<float>(n, x, y): \
111 ::cblas_##sname(static_cast<VSMC_CBLAS_INT>(n), x, 1, y, 1); \
113 inline double name (std::size_t n, const double *x, const double *y) \
115 return n < VSMC_CBLAS_THRESHOLD ? \
116 name<double>(n, x, y): \
117 ::cblas_##dname(static_cast<VSMC_CBLAS_INT>(n), x, 1, y, 1); \
120 #define VSMC_DEFINE_MATH_CBLAS_SV(name, sname, dname) \
121 inline void name (std::size_t n, float a, float *x) \
123 n < VSMC_CBLAS_THRESHOLD ? \
124 name<float>(n, a, x): \
125 ::cblas_##sname(static_cast<VSMC_CBLAS_INT>(n), a, x, 1); \
127 inline void name (std::size_t n, double a, double *x) \
129 n < VSMC_CBLAS_THRESHOLD ? \
130 name<double>(n, a, x): \
131 ::cblas_##dname(static_cast<VSMC_CBLAS_INT>(n), a, x, 1); \
134 namespace vsmc {
namespace math {
142 #endif // VSMC_CBLAS_INT
144 #endif // VSMC_MATH_CBLAS_HPP
T dot(std::size_t n, const T *x, const T *y)
The dot product.
void scal(std::size_t n, T a, T *x)
Scale a vector.
#define VSMC_DEFINE_MATH_CBLAS_SV(name, sname, dname)
T asum(std::size_t n, const T *x)
Sum of vector magnitudes.
#define VSMC_DEFINE_MATH_CBLAS_S2(name, sname, dname)
#define VSMC_DEFINE_MATH_CBLAS_S1(name, sname, dname)