26 #ifndef TILEDARRAY_BLAS_H__INCLUDED 27 #define TILEDARRAY_BLAS_H__INCLUDED 29 #include <madness/tensor/cblas.h> 38 template <
typename S1,
typename T1,
typename T2,
typename S2,
typename T3>
39 inline void gemm(madness::cblas::CBLAS_TRANSPOSE op_a,
40 madness::cblas::CBLAS_TRANSPOSE op_b,
const integer m,
const integer n,
41 const integer k,
const S1 alpha,
const T1* a,
const integer lda,
42 const T2* b,
const integer ldb,
const S2 beta, T3* c,
const integer ldc)
45 static const unsigned int 46 notrans_notrans = 0x00000000,
47 notrans_trans = 0x00000004,
48 trans_notrans = 0x00000001,
49 trans_trans = 0x00000005,
50 notrans_conjtrans = 0x00000008,
51 trans_conjtrans = 0x00000009,
52 conjtrans_notrans = 0x00000002,
53 conjtrans_trans = 0x00000006,
54 conjtrans_conjtrans = 0x0000000a;
61 (op_a == madness::cblas::NoTrans ? m : k),
62 (op_a == madness::cblas::NoTrans ? k : m),
63 Eigen::OuterStride<>(lda));
65 (op_b == madness::cblas::NoTrans ? k : n),
66 (op_b == madness::cblas::NoTrans ? n : k),
67 Eigen::OuterStride<>(ldb));
69 C(c, m, n, Eigen::OuterStride<>(ldc));
71 const bool beta_is_nonzero = (beta !=
static_cast<S2
>(0));
73 switch(op_a | (op_b << 2)) {
76 C.noalias() = alpha * A * B + beta * C;
78 C.noalias() = alpha * A * B;
82 C.noalias() = alpha * A * B.transpose() + beta * C;
84 C.noalias() = alpha * A * B.transpose();
88 C.noalias() = alpha * A.transpose() * B + beta * C;
90 C.noalias() = alpha * A.transpose() * B;
94 C.noalias() = alpha * A.transpose() * B.transpose() + beta * C;
96 C.noalias() = alpha * A.transpose() * B.transpose();
99 case notrans_conjtrans:
101 C.noalias() = alpha * A * B.adjoint() + beta * C;
103 C.noalias() = alpha * A * B.adjoint();
105 case trans_conjtrans:
107 C.noalias() = alpha * A.transpose() * B.adjoint() + beta * C;
109 C.noalias() = alpha * A.transpose() * B.adjoint();
111 case conjtrans_notrans:
113 C.noalias() = alpha * A.adjoint() * B + beta * C;
115 C.noalias() = alpha * A.adjoint() * B;
117 case conjtrans_trans:
119 C.noalias() = alpha * A.adjoint() * B.transpose() + beta * C;
121 C.noalias() = alpha * A.adjoint() * B.transpose();
123 case conjtrans_conjtrans:
125 C.noalias() = alpha * A.adjoint() * B.adjoint() + beta * C;
127 C.noalias() = alpha * A.adjoint() * B.adjoint();
132 inline void gemm(madness::cblas::CBLAS_TRANSPOSE op_a,
133 madness::cblas::CBLAS_TRANSPOSE op_b,
const integer m,
const integer n,
134 const integer k,
const float alpha,
const float* a,
const integer lda,
135 const float* b,
const integer ldb,
const float beta,
float* c,
const integer ldc)
137 madness::cblas::gemm(op_b, op_a, n, m, k, alpha, b, ldb, a, lda, beta, c, ldc);
140 inline void gemm(madness::cblas::CBLAS_TRANSPOSE op_a,
141 madness::cblas::CBLAS_TRANSPOSE op_b,
const integer m,
const integer n,
142 const integer k,
const double alpha,
const double* a,
const integer lda,
143 const double* b,
const integer ldb,
const double beta,
double* c,
const integer ldc)
145 madness::cblas::gemm(op_b, op_a, n, m, k, alpha, b, ldb, a, lda, beta, c, ldc);
148 inline void gemm(madness::cblas::CBLAS_TRANSPOSE op_a,
149 madness::cblas::CBLAS_TRANSPOSE op_b,
const integer m,
const integer n,
150 const integer k,
const std::complex<float> alpha,
const std::complex<float>* a,
151 const integer lda,
const std::complex<float>* b,
const integer ldb,
152 const std::complex<float> beta, std::complex<float>* c,
const integer ldc)
154 madness::cblas::gemm(op_b, op_a, n, m, k, alpha, b, ldb, a, lda, beta, c, ldc);
157 inline void gemm(madness::cblas::CBLAS_TRANSPOSE op_a,
158 madness::cblas::CBLAS_TRANSPOSE op_b,
const integer m,
const integer n,
159 const integer k,
const std::complex<double> alpha,
const std::complex<double>* a,
160 const integer lda,
const std::complex<double>* b,
const integer ldb,
161 const std::complex<double> beta, std::complex<double>* c,
const integer ldc)
163 madness::cblas::gemm(op_b, op_a, n, m, k, alpha, b, ldb, a, lda, beta, c, ldc);
169 template <
typename T,
typename U>
170 inline typename std::enable_if<detail::is_numeric<T>::value>::type
171 scale(
const integer n,
const T alpha, U* x) {
175 inline void scale(
const integer n,
const float alpha,
float* x) {
176 madness::cblas::scal(n, alpha, x, 1);
179 inline void scale(
const integer n,
const double alpha,
double* x) {
180 madness::cblas::scal(n, alpha, x, 1);
183 inline void scale(
const integer n,
const std::complex<float> alpha, std::complex<float>* x) {
184 madness::cblas::scal(n, alpha, x, 1);
187 inline void scale(
const integer n,
const std::complex<double> alpha, std::complex<double>* x) {
188 madness::cblas::scal(n, alpha, x, 1);
191 inline void scale(
const integer n,
const float alpha, std::complex<float>* x) {
192 madness::cblas::scal(n, alpha, x, 1);
195 inline void scale(
const integer n,
const double alpha, std::complex<double>* x) {
196 madness::cblas::scal(n, alpha, x, 1);
202 template <
typename T,
typename U>
203 T
dot(
const integer n,
const T* x,
const U* y) {
207 inline float dot(integer n,
const float* x,
const float* y) {
211 inline double dot(integer n,
const double* x,
const double* y) {
215 inline std::complex<float>
dot(integer n,
const std::complex<float>* x,
const std::complex<float>* y) {
219 inline std::complex<double>
dot(integer n,
const std::complex<double>* x,
const std::complex<double>* y) {
230 #endif // TILEDARRAY_BLAS_H__INCLUDED std::complex< double > dot(integer n, const std::complex< double > *x, const std::complex< double > *y)
Eigen::Map< const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor >, Eigen::AutoAlign > eigen_map(const T *t, const std::size_t m, const std::size_t n)
Construct a const Eigen::Map object for a given Tensor object.
void gemm(madness::cblas::CBLAS_TRANSPOSE op_a, madness::cblas::CBLAS_TRANSPOSE op_b, const integer m, const integer n, const integer k, const std::complex< double > alpha, const std::complex< double > *a, const integer lda, const std::complex< double > *b, const integer ldb, const std::complex< double > beta, std::complex< double > *c, const integer ldc)
T dot(const integer n, const T *x, const U *y)
void gemm(madness::cblas::CBLAS_TRANSPOSE op_a, madness::cblas::CBLAS_TRANSPOSE op_b, const integer m, const integer n, const integer k, const S1 alpha, const T1 *a, const integer lda, const T2 *b, const integer ldb, const S2 beta, T3 *c, const integer ldc)
std::enable_if< detail::is_numeric< T >::value >::type scale(const integer n, const T alpha, U *x)