1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/*
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Copyright (c) 2011, Intel Corporation. All rights reserved.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Redistribution and use in source and binary forms, with or without modification,
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath are permitted provided that the following conditions are met:
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Redistributions of source code must retain the above copyright notice, this
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   list of conditions and the following disclaimer.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Redistributions in binary form must reproduce the above copyright notice,
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   this list of conditions and the following disclaimer in the documentation
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   and/or other materials provided with the distribution.
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Neither the name of Intel Corporation nor the names of its contributors may
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   be used to endorse or promote products derived from this software without
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   specific prior written permission.
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ********************************************************************************
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *   Content : Eigen bindings to Intel(R) MKL
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *   General matrix-vector product functionality based on ?GEMV.
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ********************************************************************************
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath*/
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_GENERAL_MATRIX_VECTOR_MKL_H
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_GENERAL_MATRIX_VECTOR_MKL_H
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/**********************************************************************
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* This file implements general matrix-vector multiplication using BLAS
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* gemv function via partial specialization of
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* general_matrix_vector_product::run(..) method for float, double,
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* std::complex<float> and std::complex<double> types
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath**********************************************************************/
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// gemv specialization
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs>
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct general_matrix_vector_product_gemv :
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  general_matrix_vector_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,ConjugateRhs,BuiltIn> {};
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MKL_GEMV_SPECIALIZE(Scalar) \
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Index, bool ConjugateLhs, bool ConjugateRhs> \
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct general_matrix_vector_product<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs,Specialized> { \
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic EIGEN_DONT_INLINE void run( \
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows, Index cols, \
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const Scalar* lhs, Index lhsStride, \
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const Scalar* rhs, Index rhsIncr, \
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* res, Index resIncr, Scalar alpha) \
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ \
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (ConjugateLhs) { \
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    general_matrix_vector_product<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs,BuiltIn>::run( \
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      rows, cols, lhs, lhsStride, rhs, rhsIncr, res, resIncr, alpha); \
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  } else { \
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    general_matrix_vector_product_gemv<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs>::run( \
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      rows, cols, lhs, lhsStride, rhs, rhsIncr, res, resIncr, alpha); \
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  } \
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} \
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; \
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Index, bool ConjugateLhs, bool ConjugateRhs> \
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct general_matrix_vector_product<Index,Scalar,RowMajor,ConjugateLhs,Scalar,ConjugateRhs,Specialized> { \
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic EIGEN_DONT_INLINE void run( \
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows, Index cols, \
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const Scalar* lhs, Index lhsStride, \
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const Scalar* rhs, Index rhsIncr, \
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Scalar* res, Index resIncr, Scalar alpha) \
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ \
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    general_matrix_vector_product_gemv<Index,Scalar,RowMajor,ConjugateLhs,Scalar,ConjugateRhs>::run( \
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      rows, cols, lhs, lhsStride, rhs, rhsIncr, res, resIncr, alpha); \
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} \
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; \
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_GEMV_SPECIALIZE(double)
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_GEMV_SPECIALIZE(float)
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_GEMV_SPECIALIZE(dcomplex)
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_GEMV_SPECIALIZE(scomplex)
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MKL_GEMV_SPECIALIZATION(EIGTYPE,MKLTYPE,MKLPREFIX) \
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Index, int LhsStorageOrder, bool ConjugateLhs, bool ConjugateRhs> \
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct general_matrix_vector_product_gemv<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,ConjugateRhs> \
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ \
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Matrix<EIGTYPE,Dynamic,1,ColMajor> GEMVVector;\
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath\
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic EIGEN_DONT_INLINE void run( \
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows, Index cols, \
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const EIGTYPE* lhs, Index lhsStride, \
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const EIGTYPE* rhs, Index rhsIncr, \
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGTYPE* res, Index resIncr, EIGTYPE alpha) \
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ \
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MKL_INT m=rows, n=cols, lda=lhsStride, incx=rhsIncr, incy=resIncr; \
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MKLTYPE alpha_, beta_; \
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const EIGTYPE *x_ptr, myone(1); \
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  char trans=(LhsStorageOrder==ColMajor) ? 'N' : (ConjugateLhs) ? 'C' : 'T'; \
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (LhsStorageOrder==RowMajor) { \
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m=cols; \
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    n=rows; \
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }\
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  assign_scalar_eig2mkl(alpha_, alpha); \
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  assign_scalar_eig2mkl(beta_, myone); \
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  GEMVVector x_tmp; \
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (ConjugateRhs) { \
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Map<const GEMVVector, 0, InnerStride<> > map_x(rhs,cols,1,InnerStride<>(incx)); \
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    x_tmp=map_x.conjugate(); \
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    x_ptr=x_tmp.data(); \
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    incx=1; \
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  } else x_ptr=rhs; \
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MKLPREFIX##gemv(&trans, &m, &n, &alpha_, (const MKLTYPE*)lhs, &lda, (const MKLTYPE*)x_ptr, &incx, &beta_, (MKLTYPE*)res, &incy); \
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}\
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_GEMV_SPECIALIZATION(double,   double,        d)
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_GEMV_SPECIALIZATION(float,    float,         s)
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_GEMV_SPECIALIZATION(dcomplex, MKL_Complex16, z)
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_GEMV_SPECIALIZATION(scomplex, MKL_Complex8,  c)
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespase internal
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_GENERAL_MATRIX_VECTOR_MKL_H
132