12int EIGEN_BLAS_FUNC(gemm)(
const char *opa,
const char *opb,
const int *m,
const int *n,
const int *k,
const RealScalar *palpha,
13 const RealScalar *pa,
const int *lda,
const RealScalar *pb,
const int *ldb,
const RealScalar *pbeta, RealScalar *pc,
const int *ldc)
16 typedef void (*functype)(DenseIndex, DenseIndex, DenseIndex,
const Scalar *, DenseIndex,
const Scalar *, DenseIndex, Scalar *, DenseIndex, DenseIndex, Scalar, internal::level3_blocking<Scalar,Scalar>&,
Eigen::internal::GemmParallelInfo<DenseIndex>*);
17 static const functype func[12] = {
19 (internal::general_matrix_matrix_product<DenseIndex,Scalar,ColMajor,false,Scalar,ColMajor,false,ColMajor,1>::run),
21 (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,false,Scalar,ColMajor,false,ColMajor,1>::run),
23 (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,false,ColMajor,1>::run),
26 (internal::general_matrix_matrix_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,false,ColMajor,1>::run),
28 (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,false,Scalar,RowMajor,false,ColMajor,1>::run),
30 (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,RowMajor,false,ColMajor,1>::run),
33 (internal::general_matrix_matrix_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,Conj, ColMajor,1>::run),
35 (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,false,Scalar,RowMajor,Conj, ColMajor,1>::run),
37 (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,RowMajor,Conj, ColMajor,1>::run),
41 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
42 const Scalar* b =
reinterpret_cast<const Scalar*
>(pb);
43 Scalar* c =
reinterpret_cast<Scalar*
>(pc);
44 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
45 Scalar beta = *
reinterpret_cast<const Scalar*
>(pbeta);
48 if(OP(*opa)==INVALID) info = 1;
49 else if(OP(*opb)==INVALID) info = 2;
50 else if(*m<0) info = 3;
51 else if(*n<0) info = 4;
52 else if(*k<0) info = 5;
53 else if(*lda<std::max(1,(OP(*opa)==NOTR)?*m:*k)) info = 8;
54 else if(*ldb<std::max(1,(OP(*opb)==NOTR)?*k:*n)) info = 10;
55 else if(*ldc<std::max(1,*m)) info = 13;
57 return xerbla_(SCALAR_SUFFIX_UP
"GEMM ",&info,6);
59 if (*m == 0 || *n == 0)
64 if(beta==Scalar(0)) matrix(c, *m, *n, *ldc).setZero();
65 else matrix(c, *m, *n, *ldc) *= beta;
71 internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic> blocking(*m,*n,*k,1,
true);
73 int code = OP(*opa) | (OP(*opb) << 2);
74 func[code](*m, *n, *k, a, *lda, b, *ldb, c, 1, *ldc, alpha, blocking, 0);
78int EIGEN_BLAS_FUNC(trsm)(
const char *side,
const char *uplo,
const char *opa,
const char *diag,
const int *m,
const int *n,
79 const RealScalar *palpha,
const RealScalar *pa,
const int *lda, RealScalar *pb,
const int *ldb)
82 typedef void (*functype)(DenseIndex, DenseIndex,
const Scalar *, DenseIndex, Scalar *, DenseIndex, DenseIndex, internal::level3_blocking<Scalar,Scalar>&);
83 static const functype func[32] = {
85 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|0, false,ColMajor,ColMajor,1>::run),
87 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|0, false,RowMajor,ColMajor,1>::run),
89 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|0, Conj, RowMajor,ColMajor,1>::run),\
92 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|0, false,ColMajor,ColMajor,1>::run),
94 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|0, false,RowMajor,ColMajor,1>::run),
96 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|0, Conj, RowMajor,ColMajor,1>::run),
99 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|0, false,ColMajor,ColMajor,1>::run),
101 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|0, false,RowMajor,ColMajor,1>::run),
103 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|0, Conj, RowMajor,ColMajor,1>::run),
106 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|0, false,ColMajor,ColMajor,1>::run),
108 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|0, false,RowMajor,ColMajor,1>::run),
110 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|0, Conj, RowMajor,ColMajor,1>::run),
113 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|UnitDiag,false,ColMajor,ColMajor,1>::run),
115 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|UnitDiag,false,RowMajor,ColMajor,1>::run),
117 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|UnitDiag,Conj, RowMajor,ColMajor,1>::run),
120 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|UnitDiag,false,ColMajor,ColMajor,1>::run),
122 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|UnitDiag,false,RowMajor,ColMajor,1>::run),
124 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|UnitDiag,Conj, RowMajor,ColMajor,1>::run),
127 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|UnitDiag,false,ColMajor,ColMajor,1>::run),
129 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|UnitDiag,false,RowMajor,ColMajor,1>::run),
131 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|UnitDiag,Conj, RowMajor,ColMajor,1>::run),
134 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|UnitDiag,false,ColMajor,ColMajor,1>::run),
136 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|UnitDiag,false,RowMajor,ColMajor,1>::run),
138 (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|UnitDiag,Conj, RowMajor,ColMajor,1>::run),
142 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
143 Scalar* b =
reinterpret_cast<Scalar*
>(pb);
144 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
147 if(SIDE(*side)==INVALID) info = 1;
148 else if(UPLO(*uplo)==INVALID) info = 2;
149 else if(OP(*opa)==INVALID) info = 3;
150 else if(DIAG(*diag)==INVALID) info = 4;
151 else if(*m<0) info = 5;
152 else if(*n<0) info = 6;
153 else if(*lda<std::max(1,(SIDE(*side)==LEFT)?*m:*n)) info = 9;
154 else if(*ldb<std::max(1,*m)) info = 11;
156 return xerbla_(SCALAR_SUFFIX_UP
"TRSM ",&info,6);
161 int code = OP(*opa) | (SIDE(*side) << 2) | (UPLO(*uplo) << 3) | (DIAG(*diag) << 4);
163 if(SIDE(*side)==LEFT)
165 internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic,4> blocking(*m,*n,*m,1,
false);
166 func[code](*m, *n, a, *lda, b, 1, *ldb, blocking);
170 internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic,4> blocking(*m,*n,*n,1,
false);
171 func[code](*n, *m, a, *lda, b, 1, *ldb, blocking);
175 matrix(b,*m,*n,*ldb) *= alpha;
183int EIGEN_BLAS_FUNC(trmm)(
const char *side,
const char *uplo,
const char *opa,
const char *diag,
const int *m,
const int *n,
184 const RealScalar *palpha,
const RealScalar *pa,
const int *lda, RealScalar *pb,
const int *ldb)
187 typedef void (*functype)(DenseIndex, DenseIndex, DenseIndex,
const Scalar *, DenseIndex,
const Scalar *, DenseIndex, Scalar *, DenseIndex, DenseIndex,
const Scalar&, internal::level3_blocking<Scalar,Scalar>&);
188 static const functype func[32] = {
190 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0, true, ColMajor,false,ColMajor,false,ColMajor,1>::run),
192 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0, true, RowMajor,false,ColMajor,false,ColMajor,1>::run),
194 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0, true, RowMajor,Conj, ColMajor,false,ColMajor,1>::run),
197 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0, false,ColMajor,false,ColMajor,false,ColMajor,1>::run),
199 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0, false,ColMajor,false,RowMajor,false,ColMajor,1>::run),
201 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0, false,ColMajor,false,RowMajor,Conj, ColMajor,1>::run),
204 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0, true, ColMajor,false,ColMajor,false,ColMajor,1>::run),
206 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0, true, RowMajor,false,ColMajor,false,ColMajor,1>::run),
208 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0, true, RowMajor,Conj, ColMajor,false,ColMajor,1>::run),
211 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0, false,ColMajor,false,ColMajor,false,ColMajor,1>::run),
213 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0, false,ColMajor,false,RowMajor,false,ColMajor,1>::run),
215 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0, false,ColMajor,false,RowMajor,Conj, ColMajor,1>::run),
218 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,true, ColMajor,false,ColMajor,false,ColMajor,1>::run),
220 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,true, RowMajor,false,ColMajor,false,ColMajor,1>::run),
222 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,true, RowMajor,Conj, ColMajor,false,ColMajor,1>::run),
225 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,false,ColMajor,false,ColMajor,false,ColMajor,1>::run),
227 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,false,ColMajor,false,RowMajor,false,ColMajor,1>::run),
229 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,false,ColMajor,false,RowMajor,Conj, ColMajor,1>::run),
232 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,true, ColMajor,false,ColMajor,false,ColMajor,1>::run),
234 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,true, RowMajor,false,ColMajor,false,ColMajor,1>::run),
236 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,true, RowMajor,Conj, ColMajor,false,ColMajor,1>::run),
239 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,false,ColMajor,false,ColMajor,false,ColMajor,1>::run),
241 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,false,ColMajor,false,RowMajor,false,ColMajor,1>::run),
243 (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,false,ColMajor,false,RowMajor,Conj, ColMajor,1>::run),
247 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
248 Scalar* b =
reinterpret_cast<Scalar*
>(pb);
249 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
252 if(SIDE(*side)==INVALID) info = 1;
253 else if(UPLO(*uplo)==INVALID) info = 2;
254 else if(OP(*opa)==INVALID) info = 3;
255 else if(DIAG(*diag)==INVALID) info = 4;
256 else if(*m<0) info = 5;
257 else if(*n<0) info = 6;
258 else if(*lda<std::max(1,(SIDE(*side)==LEFT)?*m:*n)) info = 9;
259 else if(*ldb<std::max(1,*m)) info = 11;
261 return xerbla_(SCALAR_SUFFIX_UP
"TRMM ",&info,6);
263 int code = OP(*opa) | (SIDE(*side) << 2) | (UPLO(*uplo) << 3) | (DIAG(*diag) << 4);
270 matrix(b,*m,*n,*ldb).setZero();
272 if(SIDE(*side)==LEFT)
274 internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic,4> blocking(*m,*n,*m,1,
false);
275 func[code](*m, *n, *m, a, *lda, tmp.
data(), tmp.outerStride(), b, 1, *ldb, alpha, blocking);
279 internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic,4> blocking(*m,*n,*n,1,
false);
280 func[code](*m, *n, *n, tmp.
data(), tmp.outerStride(), a, *lda, b, 1, *ldb, alpha, blocking);
287int EIGEN_BLAS_FUNC(symm)(
const char *side,
const char *uplo,
const int *m,
const int *n,
const RealScalar *palpha,
288 const RealScalar *pa,
const int *lda,
const RealScalar *pb,
const int *ldb,
const RealScalar *pbeta, RealScalar *pc,
const int *ldc)
291 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
292 const Scalar* b =
reinterpret_cast<const Scalar*
>(pb);
293 Scalar* c =
reinterpret_cast<Scalar*
>(pc);
294 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
295 Scalar beta = *
reinterpret_cast<const Scalar*
>(pbeta);
298 if(SIDE(*side)==INVALID) info = 1;
299 else if(UPLO(*uplo)==INVALID) info = 2;
300 else if(*m<0) info = 3;
301 else if(*n<0) info = 4;
302 else if(*lda<std::max(1,(SIDE(*side)==LEFT)?*m:*n)) info = 7;
303 else if(*ldb<std::max(1,*m)) info = 9;
304 else if(*ldc<std::max(1,*m)) info = 12;
306 return xerbla_(SCALAR_SUFFIX_UP
"SYMM ",&info,6);
310 if(beta==Scalar(0)) matrix(c, *m, *n, *ldc).setZero();
311 else matrix(c, *m, *n, *ldc) *= beta;
319 int size = (SIDE(*side)==LEFT) ? (*m) : (*n);
325 matA.triangularView<
Upper>() = matrix(a,size,size,*lda);
326 matA.triangularView<
Lower>() = matrix(a,size,size,*lda).transpose();
328 else if(UPLO(*uplo)==LO)
330 matA.triangularView<
Lower>() = matrix(a,size,size,*lda);
331 matA.triangularView<
Upper>() = matrix(a,size,size,*lda).transpose();
333 if(SIDE(*side)==LEFT)
334 matrix(c, *m, *n, *ldc) += alpha * matA * matrix(b, *m, *n, *ldb);
335 else if(SIDE(*side)==RIGHT)
336 matrix(c, *m, *n, *ldc) += alpha * matrix(b, *m, *n, *ldb) * matA;
338 internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic> blocking(*m,*n,size,1,
false);
340 if(SIDE(*side)==LEFT)
341 if(UPLO(*uplo)==UP) internal::product_selfadjoint_matrix<Scalar, DenseIndex, RowMajor,true,false, ColMajor,false,false, ColMajor,1>::run(*m, *n, a, *lda, b, *ldb, c, 1, *ldc, alpha, blocking);
342 else if(UPLO(*uplo)==LO) internal::product_selfadjoint_matrix<Scalar, DenseIndex, ColMajor,true,false, ColMajor,false,false, ColMajor,1>::run(*m, *n, a, *lda, b, *ldb, c, 1, *ldc, alpha, blocking);
344 else if(SIDE(*side)==RIGHT)
345 if(UPLO(*uplo)==UP) internal::product_selfadjoint_matrix<Scalar, DenseIndex, ColMajor,false,false, RowMajor,true,false, ColMajor,1>::run(*m, *n, b, *ldb, a, *lda, c, 1, *ldc, alpha, blocking);
346 else if(UPLO(*uplo)==LO) internal::product_selfadjoint_matrix<Scalar, DenseIndex, ColMajor,false,false, ColMajor,true,false, ColMajor,1>::run(*m, *n, b, *ldb, a, *lda, c, 1, *ldc, alpha, blocking);
357int EIGEN_BLAS_FUNC(syrk)(
const char *uplo,
const char *op,
const int *n,
const int *k,
358 const RealScalar *palpha,
const RealScalar *pa,
const int *lda,
const RealScalar *pbeta, RealScalar *pc,
const int *ldc)
362 typedef void (*functype)(DenseIndex, DenseIndex,
const Scalar *, DenseIndex,
const Scalar *, DenseIndex, Scalar *, DenseIndex, DenseIndex,
const Scalar&, internal::level3_blocking<Scalar,Scalar>&);
363 static const functype func[8] = {
365 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,ColMajor,Conj, 1, Upper>::run),
367 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,false,Scalar,ColMajor,ColMajor,Conj, 1, Upper>::run),
369 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,ColMajor,false,1, Upper>::run),
372 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,ColMajor,Conj, 1, Lower>::run),
374 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,false,Scalar,ColMajor,ColMajor,Conj, 1, Lower>::run),
376 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,ColMajor,false,1, Lower>::run),
381 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
382 Scalar* c =
reinterpret_cast<Scalar*
>(pc);
383 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
384 Scalar beta = *
reinterpret_cast<const Scalar*
>(pbeta);
387 if(UPLO(*uplo)==INVALID) info = 1;
388 else if(OP(*op)==INVALID || (ISCOMPLEX && OP(*op)==ADJ) ) info = 2;
389 else if(*n<0) info = 3;
390 else if(*k<0) info = 4;
391 else if(*lda<std::max(1,(OP(*op)==NOTR)?*n:*k)) info = 7;
392 else if(*ldc<std::max(1,*n)) info = 10;
394 return xerbla_(SCALAR_SUFFIX_UP
"SYRK ",&info,6);
399 if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<
Upper>().setZero();
400 else matrix(c, *n, *n, *ldc).triangularView<
Upper>() *= beta;
402 if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<
Lower>().setZero();
403 else matrix(c, *n, *n, *ldc).triangularView<
Lower>() *= beta;
414 matrix(c, *n, *n, *ldc).triangularView<
Upper>() += alpha * matrix(a,*n,*k,*lda) * matrix(a,*n,*k,*lda).transpose();
416 matrix(c, *n, *n, *ldc).triangularView<
Upper>() += alpha * matrix(a,*k,*n,*lda).transpose() * matrix(a,*k,*n,*lda);
421 matrix(c, *n, *n, *ldc).triangularView<
Lower>() += alpha * matrix(a,*n,*k,*lda) * matrix(a,*n,*k,*lda).transpose();
423 matrix(c, *n, *n, *ldc).triangularView<
Lower>() += alpha * matrix(a,*k,*n,*lda).transpose() * matrix(a,*k,*n,*lda);
426 internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic> blocking(*n,*n,*k,1,
false);
428 int code = OP(*op) | (UPLO(*uplo) << 2);
429 func[code](*n, *k, a, *lda, a, *lda, c, 1, *ldc, alpha, blocking);
437int EIGEN_BLAS_FUNC(syr2k)(
const char *uplo,
const char *op,
const int *n,
const int *k,
const RealScalar *palpha,
438 const RealScalar *pa,
const int *lda,
const RealScalar *pb,
const int *ldb,
const RealScalar *pbeta, RealScalar *pc,
const int *ldc)
440 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
441 const Scalar* b =
reinterpret_cast<const Scalar*
>(pb);
442 Scalar* c =
reinterpret_cast<Scalar*
>(pc);
443 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
444 Scalar beta = *
reinterpret_cast<const Scalar*
>(pbeta);
449 if(UPLO(*uplo)==INVALID) info = 1;
450 else if(OP(*op)==INVALID || (ISCOMPLEX && OP(*op)==ADJ) ) info = 2;
451 else if(*n<0) info = 3;
452 else if(*k<0) info = 4;
453 else if(*lda<std::max(1,(OP(*op)==NOTR)?*n:*k)) info = 7;
454 else if(*ldb<std::max(1,(OP(*op)==NOTR)?*n:*k)) info = 9;
455 else if(*ldc<std::max(1,*n)) info = 12;
457 return xerbla_(SCALAR_SUFFIX_UP
"SYR2K",&info,6);
462 if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<
Upper>().setZero();
463 else matrix(c, *n, *n, *ldc).triangularView<
Upper>() *= beta;
465 if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<
Lower>().setZero();
466 else matrix(c, *n, *n, *ldc).triangularView<
Lower>() *= beta;
476 matrix(c, *n, *n, *ldc).triangularView<
Upper>()
477 += alpha *matrix(a, *n, *k, *lda)*matrix(b, *n, *k, *ldb).transpose()
478 + alpha*matrix(b, *n, *k, *ldb)*matrix(a, *n, *k, *lda).transpose();
480 else if(UPLO(*uplo)==LO)
481 matrix(c, *n, *n, *ldc).triangularView<
Lower>()
482 += alpha*matrix(a, *n, *k, *lda)*matrix(b, *n, *k, *ldb).transpose()
483 + alpha*matrix(b, *n, *k, *ldb)*matrix(a, *n, *k, *lda).transpose();
485 else if(OP(*op)==TR || OP(*op)==ADJ)
488 matrix(c, *n, *n, *ldc).triangularView<
Upper>()
489 += alpha*matrix(a, *k, *n, *lda).transpose()*matrix(b, *k, *n, *ldb)
490 + alpha*matrix(b, *k, *n, *ldb).transpose()*matrix(a, *k, *n, *lda);
491 else if(UPLO(*uplo)==LO)
492 matrix(c, *n, *n, *ldc).triangularView<
Lower>()
493 += alpha*matrix(a, *k, *n, *lda).transpose()*matrix(b, *k, *n, *ldb)
494 + alpha*matrix(b, *k, *n, *ldb).transpose()*matrix(a, *k, *n, *lda);
505int EIGEN_BLAS_FUNC(hemm)(
const char *side,
const char *uplo,
const int *m,
const int *n,
const RealScalar *palpha,
506 const RealScalar *pa,
const int *lda,
const RealScalar *pb,
const int *ldb,
const RealScalar *pbeta, RealScalar *pc,
const int *ldc)
508 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
509 const Scalar* b =
reinterpret_cast<const Scalar*
>(pb);
510 Scalar* c =
reinterpret_cast<Scalar*
>(pc);
511 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
512 Scalar beta = *
reinterpret_cast<const Scalar*
>(pbeta);
517 if(SIDE(*side)==INVALID) info = 1;
518 else if(UPLO(*uplo)==INVALID) info = 2;
519 else if(*m<0) info = 3;
520 else if(*n<0) info = 4;
521 else if(*lda<std::max(1,(SIDE(*side)==LEFT)?*m:*n)) info = 7;
522 else if(*ldb<std::max(1,*m)) info = 9;
523 else if(*ldc<std::max(1,*m)) info = 12;
525 return xerbla_(SCALAR_SUFFIX_UP
"HEMM ",&info,6);
527 if(beta==Scalar(0)) matrix(c, *m, *n, *ldc).setZero();
528 else if(beta!=Scalar(1)) matrix(c, *m, *n, *ldc) *= beta;
535 int size = (SIDE(*side)==LEFT) ? (*m) : (*n);
536 internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic> blocking(*m,*n,size,1,
false);
538 if(SIDE(*side)==LEFT)
540 if(UPLO(*uplo)==UP) internal::product_selfadjoint_matrix<Scalar,DenseIndex,RowMajor,true,Conj, ColMajor,false,false, ColMajor, 1>
541 ::run(*m, *n, a, *lda, b, *ldb, c, 1, *ldc, alpha, blocking);
542 else if(UPLO(*uplo)==LO) internal::product_selfadjoint_matrix<Scalar,DenseIndex,ColMajor,true,false, ColMajor,false,false, ColMajor,1>
543 ::run(*m, *n, a, *lda, b, *ldb, c, 1, *ldc, alpha, blocking);
546 else if(SIDE(*side)==RIGHT)
548 if(UPLO(*uplo)==UP) matrix(c,*m,*n,*ldc) += alpha * matrix(b,*m,*n,*ldb) * matrix(a,*n,*n,*lda).selfadjointView<
Upper>();
550 else if(UPLO(*uplo)==LO) internal::product_selfadjoint_matrix<Scalar,DenseIndex,ColMajor,false,false, ColMajor,true,false, ColMajor,1>
551 ::run(*m, *n, b, *ldb, a, *lda, c, 1, *ldc, alpha, blocking);
564int EIGEN_BLAS_FUNC(herk)(
const char *uplo,
const char *op,
const int *n,
const int *k,
565 const RealScalar *palpha,
const RealScalar *pa,
const int *lda,
const RealScalar *pbeta, RealScalar *pc,
const int *ldc)
569 typedef void (*functype)(DenseIndex, DenseIndex,
const Scalar *, DenseIndex,
const Scalar *, DenseIndex, Scalar *, DenseIndex, DenseIndex,
const Scalar&, internal::level3_blocking<Scalar,Scalar>&);
570 static const functype func[8] = {
572 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,Conj, ColMajor,1,Upper>::run),
575 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,false,ColMajor,1,Upper>::run),
578 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,Conj, ColMajor,1,Lower>::run),
581 (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,false,ColMajor,1,Lower>::run),
585 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
586 Scalar* c =
reinterpret_cast<Scalar*
>(pc);
587 RealScalar alpha = *palpha;
588 RealScalar beta = *pbeta;
593 if(UPLO(*uplo)==INVALID) info = 1;
594 else if((OP(*op)==INVALID) || (OP(*op)==TR)) info = 2;
595 else if(*n<0) info = 3;
596 else if(*k<0) info = 4;
597 else if(*lda<std::max(1,(OP(*op)==NOTR)?*n:*k)) info = 7;
598 else if(*ldc<std::max(1,*n)) info = 10;
600 return xerbla_(SCALAR_SUFFIX_UP
"HERK ",&info,6);
602 int code = OP(*op) | (UPLO(*uplo) << 2);
604 if(beta!=RealScalar(1))
607 if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<
Upper>().setZero();
608 else matrix(c, *n, *n, *ldc).triangularView<
StrictlyUpper>() *= beta;
610 if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<
Lower>().setZero();
611 else matrix(c, *n, *n, *ldc).triangularView<
StrictlyLower>() *= beta;
615 matrix(c, *n, *n, *ldc).diagonal().real() *= beta;
616 matrix(c, *n, *n, *ldc).diagonal().imag().setZero();
620 if(*k>0 && alpha!=RealScalar(0))
622 internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic> blocking(*n,*n,*k,1,
false);
623 func[code](*n, *k, a, *lda, a, *lda, c, 1, *ldc, alpha, blocking);
624 matrix(c, *n, *n, *ldc).diagonal().imag().setZero();
631int EIGEN_BLAS_FUNC(her2k)(
const char *uplo,
const char *op,
const int *n,
const int *k,
632 const RealScalar *palpha,
const RealScalar *pa,
const int *lda,
const RealScalar *pb,
const int *ldb,
const RealScalar *pbeta, RealScalar *pc,
const int *ldc)
634 const Scalar* a =
reinterpret_cast<const Scalar*
>(pa);
635 const Scalar* b =
reinterpret_cast<const Scalar*
>(pb);
636 Scalar* c =
reinterpret_cast<Scalar*
>(pc);
637 Scalar alpha = *
reinterpret_cast<const Scalar*
>(palpha);
638 RealScalar beta = *pbeta;
643 if(UPLO(*uplo)==INVALID) info = 1;
644 else if((OP(*op)==INVALID) || (OP(*op)==TR)) info = 2;
645 else if(*n<0) info = 3;
646 else if(*k<0) info = 4;
647 else if(*lda<std::max(1,(OP(*op)==NOTR)?*n:*k)) info = 7;
648 else if(*ldb<std::max(1,(OP(*op)==NOTR)?*n:*k)) info = 9;
649 else if(*ldc<std::max(1,*n)) info = 12;
651 return xerbla_(SCALAR_SUFFIX_UP
"HER2K",&info,6);
653 if(beta!=RealScalar(1))
656 if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<
Upper>().setZero();
657 else matrix(c, *n, *n, *ldc).triangularView<
StrictlyUpper>() *= beta;
659 if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<
Lower>().setZero();
660 else matrix(c, *n, *n, *ldc).triangularView<
StrictlyLower>() *= beta;
664 matrix(c, *n, *n, *ldc).diagonal().real() *= beta;
665 matrix(c, *n, *n, *ldc).diagonal().imag().setZero();
668 else if(*k>0 && alpha!=Scalar(0))
669 matrix(c, *n, *n, *ldc).diagonal().imag().setZero();
678 matrix(c, *n, *n, *ldc).triangularView<
Upper>()
679 += alpha *matrix(a, *n, *k, *lda)*matrix(b, *n, *k, *ldb).adjoint()
680 + numext::conj(alpha)*matrix(b, *n, *k, *ldb)*matrix(a, *n, *k, *lda).adjoint();
682 else if(UPLO(*uplo)==LO)
683 matrix(c, *n, *n, *ldc).triangularView<
Lower>()
684 += alpha*matrix(a, *n, *k, *lda)*matrix(b, *n, *k, *ldb).adjoint()
685 + numext::conj(alpha)*matrix(b, *n, *k, *ldb)*matrix(a, *n, *k, *lda).adjoint();
687 else if(OP(*op)==ADJ)
690 matrix(c, *n, *n, *ldc).triangularView<
Upper>()
691 += alpha*matrix(a, *k, *n, *lda).adjoint()*matrix(b, *k, *n, *ldb)
692 + numext::conj(alpha)*matrix(b, *k, *n, *ldb).adjoint()*matrix(a, *k, *n, *lda);
693 else if(UPLO(*uplo)==LO)
694 matrix(c, *n, *n, *ldc).triangularView<
Lower>()
695 += alpha*matrix(a, *k, *n, *lda).adjoint()*matrix(b, *k, *n, *ldb)
696 + numext::conj(alpha)*matrix(b, *k, *n, *ldb).adjoint()*matrix(a, *k, *n, *lda);
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:180
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar * data() const
Definition PlainObjectBase.h:247
@ StrictlyLower
Definition Constants.h:221
@ StrictlyUpper
Definition Constants.h:223
@ Lower
Definition Constants.h:209
@ Upper
Definition Constants.h:211
Definition Parallelizer.h:80