MAGMA  1.2.0
MatrixAlgebraonGPUandMulticoreArchitectures
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
pzgemm.c
Go to the documentation of this file.
1 
16 #include "common.h"
17 
18 #define A(m, n) dA, m, n
19 #define B(m, n) dB, m, n
20 #define C(m, n) dC, m, n
21 
22 /***************************************************************************/
25 void magma_pzgemm(PLASMA_enum transA, PLASMA_enum transB,
26  PLASMA_Complex64_t alpha, magma_desc_t *dA, magma_desc_t *dB,
27  PLASMA_Complex64_t beta, magma_desc_t *dC,
28  magma_sequence_t *sequence, magma_request_t *request)
29 {
31  MorseOption_t options;
32  PLASMA_desc A = dA->desc;
33  PLASMA_desc C = dC->desc;
34  int k, m, n;
35  int tempmm, tempnn, tempkn, tempkm;
36 
37  PLASMA_Complex64_t zone = (PLASMA_Complex64_t) 1.0;
38  PLASMA_Complex64_t zbeta;
39 
40  magma = magma_context_self();
41  if (sequence->status != MAGMA_SUCCESS)
42  return;
43 
44  morse_options_init( &options, magma, sequence, request );
45 
46  for (m = 0; m < C.mt; m++) {
47  tempmm = m == C.mt-1 ? C.m-m*C.mb : C.mb;
48  for (n = 0; n < C.nt; n++) {
49  tempnn = n == C.nt-1 ? C.n-n*C.nb : C.nb;
50  /*
51  * A: PlasmaNoTrans / B: PlasmaNoTrans
52  */
53  if (transA == PlasmaNoTrans) {
54  if (transB == PlasmaNoTrans) {
55  for (k = 0; k < A.nt; k++) {
56  tempkn = k == A.nt-1 ? A.n-k*A.nb : A.nb;
57  zbeta = k == 0 ? beta : zone;
59  &options,
60  transA, transB,
61  tempmm, tempnn, tempkn,
62  alpha, A(m, k),
63  B(k, n),
64  zbeta, C(m, n));
65  }
66  }
67  /*
68  * A: PlasmaNoTrans / B: Plasma[Conj]Trans
69  */
70  else {
71  for (k = 0; k < A.nt; k++) {
72  tempkn = k == A.nt-1 ? A.n-k*A.nb : A.nb;
73  zbeta = k == 0 ? beta : zone;
75  &options,
76  transA, transB,
77  tempmm, tempnn, tempkn,
78  alpha, A(m, k), /* lda * Z */
79  B(n, k), /* ldb * Z */
80  zbeta, C(m, n)); /* ldc * Y */
81  }
82  }
83  }
84  /*
85  * A: Plasma[Conj]Trans / B: PlasmaNoTrans
86  */
87  else {
88  if (transB == PlasmaNoTrans) {
89  for (k = 0; k < A.mt; k++) {
90  tempkm = k == A.mt-1 ? A.m-k*A.mb : A.mb;
91  zbeta = k == 0 ? beta : zone;
93  &options,
94  transA, transB,
95  tempmm, tempnn, tempkm,
96  alpha, A(k, m), /* lda * X */
97  B(k, n), /* ldb * Y */
98  zbeta, C(m, n)); /* ldc * Y */
99  }
100  }
101  /*
102  * A: Plasma[Conj]Trans / B: Plasma[Conj]Trans
103  */
104  else {
105  for (k = 0; k < A.mt; k++) {
106  tempkm = k == A.mt-1 ? A.m-k*A.mb : A.mb;
107  zbeta = k == 0 ? beta : zone;
108  MORSE_zgemm(
109  &options,
110  transA, transB,
111  tempmm, tempnn, tempkm,
112  alpha, A(k, m), /* lda * X */
113  B(n, k), /* ldb * Z */
114  zbeta, C(m, n)); /* ldc * Y */
115  }
116  }
117  }
118  }
119  }
120  morse_options_finalize( &options, magma );
121 }