PLASMA  2.4.5
PLASMA - Parallel Linear Algebra for Scalable Multi-core Architectures
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
pchemm.c
Go to the documentation of this file.
1 
16 #include "common.h"
17 
18 #define A(m,n) BLKADDR(A, PLASMA_Complex32_t, m, n)
19 #define B(m,n) BLKADDR(B, PLASMA_Complex32_t, m, n)
20 #define C(m,n) BLKADDR(C, PLASMA_Complex32_t, m, n)
21 /***************************************************************************/
25 {
28  PLASMA_Complex32_t alpha;
29  PLASMA_desc A;
30  PLASMA_desc B;
31  PLASMA_Complex32_t beta;
32  PLASMA_desc C;
33  PLASMA_sequence *sequence;
34  PLASMA_request *request;
35 
36  int k, m, n;
37  int next_m;
38  int next_n;
39  int ldan, ldak, ldam, ldbk, ldbm, ldcm;
40  int tempmm, tempnn, tempkm, tempkn;
41 
42  PLASMA_Complex32_t zbeta;
44 
45  plasma_unpack_args_9(side, uplo, alpha, A, B, beta, C, sequence, request);
46  if (sequence->status != PLASMA_SUCCESS)
47  return;
48 
49  n = 0;
50  m = PLASMA_RANK;
51  while (m >= C.mt && n < C.nt) {
52  n++;
53  m = m-C.mt;
54  }
55 
56  while (n < C.nt) {
57  next_m = m;
58  next_n = n;
59 
60  next_m += PLASMA_SIZE;
61  while (next_m >= C.mt && next_n < C.nt) {
62  next_n++;
63  next_m = next_m - C.mt;
64  }
65 
66  tempmm = m == C.mt-1 ? C.m-m*C.mb : C.mb;
67  tempnn = n == C.nt-1 ? C.n-n*C.nb : C.nb;
68  ldcm = BLKLDD(C, m);
69  /*
70  * PlasmaLeft / PlasmaLower
71  */
72  if (side == PlasmaLeft) {
73  ldam = BLKLDD(A, m);
74  if (uplo == PlasmaLower) {
75  for (k = 0; k < C.mt; k++) {
76  tempkm = k == C.mt-1 ? C.m-k*C.mb : C.mb;
77  ldak = BLKLDD(A, k);
78  ldbk = BLKLDD(B, k);
79  zbeta = k == 0 ? beta : zone;
80  if (k < m) {
81  CORE_cgemm(
83  tempmm, tempnn, tempkm,
84  alpha, A(m, k), ldam,
85  B(k, n), ldbk,
86  zbeta, C(m, n), ldcm);
87  }
88  else {
89  if (k == m) {
90  CORE_chemm(
91  side, uplo,
92  tempmm, tempnn,
93  alpha, A(k, k), ldak,
94  B(k, n), ldbk,
95  zbeta, C(m, n), ldcm);
96  }
97  else {
98  CORE_cgemm(
100  tempmm, tempnn, tempkm,
101  alpha, A(k, m), ldak,
102  B(k, n), ldbk,
103  zbeta, C(m, n), ldcm);
104  }
105  }
106  }
107  }
108  /*
109  * PlasmaLeft / PlasmaUpper
110  */
111  else {
112  for (k = 0; k < C.mt; k++) {
113  tempkm = k == C.mt-1 ? C.m-k*C.mb : C.mb;
114  ldak = BLKLDD(A, k);
115  ldbk = BLKLDD(B, k);
116  zbeta = k == 0 ? beta : zone;
117  if (k < m) {
118  CORE_cgemm(
120  tempmm, tempnn, tempkm,
121  alpha, A(k, m), ldak,
122  B(k, n), ldbk,
123  zbeta, C(m, n), ldcm);
124  }
125  else {
126  if (k == m) {
127  CORE_chemm(
128  side, uplo,
129  tempmm, tempnn,
130  alpha, A(k, k), ldak,
131  B(k, n), ldbk,
132  zbeta, C(m, n), ldcm);
133  }
134  else {
135  CORE_cgemm(
137  tempmm, tempnn, tempkm,
138  alpha, A(m, k), ldam,
139  B(k, n), ldbk,
140  zbeta, C(m, n), ldcm);
141  }
142  }
143  }
144  }
145  }
146  /*
147  * PlasmaRight / PlasmaLower
148  */
149  else {
150  ldan = BLKLDD(A, n);
151  ldbm = BLKLDD(B, m);
152  if (uplo == PlasmaLower) {
153  for (k = 0; k < C.nt; k++) {
154  tempkn = k == C.nt-1 ? C.n-k*C.nb : C.nb;
155  ldak = BLKLDD(A, k);
156  zbeta = k == 0 ? beta : zone;
157  if (k < n) {
158  CORE_cgemm(
160  tempmm, tempnn, tempkn,
161  alpha, B(m, k), ldbm,
162  A(n, k), ldan,
163  zbeta, C(m, n), ldcm);
164  }
165  else {
166  if (n == k) {
167  CORE_chemm(
168  side, uplo,
169  tempmm, tempnn,
170  alpha, A(k, k), ldak,
171  B(m, k), ldbm,
172  zbeta, C(m, n), ldcm);
173  }
174  else {
175  CORE_cgemm(
177  tempmm, tempnn, tempkn,
178  alpha, B(m, k), ldbm,
179  A(k, n), ldak,
180  zbeta, C(m, n), ldcm);
181  }
182  }
183  }
184  }
185  /*
186  * PlasmaRight / PlasmaUpper
187  */
188  else {
189  for (k = 0; k < C.nt; k++) {
190  tempkn = k == C.nt-1 ? C.n-k*C.nb : C.nb;
191  ldak = BLKLDD(A, k);
192  zbeta = k == 0 ? beta : zone;
193  if (k < n) {
194  CORE_cgemm(
196  tempmm, tempnn, tempkn,
197  alpha, B(m, k), ldbm,
198  A(k, n), ldak,
199  zbeta, C(m, n), ldcm);
200  }
201  else {
202  if (n == k) {
203  CORE_chemm(
204  side, uplo,
205  tempmm, tempnn,
206  alpha, A(k, k), ldak,
207  B(m, k), ldbm,
208  zbeta, C(m, n), ldcm);
209  }
210  else {
211  CORE_cgemm(
213  tempmm, tempnn, tempkn,
214  alpha, B(m, k), ldbm,
215  A(n, k), ldan,
216  zbeta, C(m, n), ldcm);
217  }
218  }
219  }
220  }
221  }
222  m = next_m;
223  n = next_n;
224  }
225 }
226 
227 /***************************************************************************/
233  PLASMA_sequence *sequence, PLASMA_request *request)
234 {
237 
238  int k, m, n;
239  int ldam, ldan, ldak, ldbk, ldbm, ldcm;
240  int tempmm, tempnn, tempkn, tempkm;
241 
242  PLASMA_Complex32_t zbeta;
244 
245  plasma = plasma_context_self();
246  if (sequence->status != PLASMA_SUCCESS)
247  return;
248  QUARK_Task_Flag_Set(&task_flags, TASK_SEQUENCE, (intptr_t)sequence->quark_sequence);
249 
250  for(m = 0; m < C.mt; m++) {
251  tempmm = m == C.mt-1 ? C.m-m*C.mb : C.mb;
252  ldcm = BLKLDD(C, m);
253  for(n = 0; n < C.nt; n++) {
254  tempnn = n == C.nt-1 ? C.n-n*C.nb : C.nb;
255  /*
256  * PlasmaLeft / PlasmaLower
257  */
258  if (side == PlasmaLeft) {
259  ldam = BLKLDD(A, m);
260  if (uplo == PlasmaLower) {
261  for (k = 0; k < C.mt; k++) {
262  tempkm = k == C.mt-1 ? C.m-k*C.mb : C.mb;
263  ldak = BLKLDD(A, k);
264  ldbk = BLKLDD(B, k);
265  zbeta = k == 0 ? beta : zone;
266  if (k < m) {
268  plasma->quark, &task_flags,
270  tempmm, tempnn, tempkm, A.mb,
271  alpha, A(m, k), ldam, /* lda * K */
272  B(k, n), ldbk, /* ldb * Y */
273  zbeta, C(m, n), ldcm); /* ldc * Y */
274  }
275  else {
276  if (k == m) {
278  plasma->quark, &task_flags,
279  side, uplo,
280  tempmm, tempnn, A.mb,
281  alpha, A(k, k), ldak, /* ldak * X */
282  B(k, n), ldbk, /* ldb * Y */
283  zbeta, C(m, n), ldcm); /* ldc * Y */
284  }
285  else {
287  plasma->quark, &task_flags,
289  tempmm, tempnn, tempkm, A.mb,
290  alpha, A(k, m), ldak, /* ldak * X */
291  B(k, n), ldbk, /* ldb * Y */
292  zbeta, C(m, n), ldcm); /* ldc * Y */
293  }
294  }
295  }
296  }
297  /*
298  * PlasmaLeft / PlasmaUpper
299  */
300  else {
301  for (k = 0; k < C.mt; k++) {
302  tempkm = k == C.mt-1 ? C.m-k*C.mb : C.mb;
303  ldak = BLKLDD(A, k);
304  ldbk = BLKLDD(B, k);
305  zbeta = k == 0 ? beta : zone;
306  if (k < m) {
308  plasma->quark, &task_flags,
310  tempmm, tempnn, tempkm, A.mb,
311  alpha, A(k, m), ldak, /* ldak * X */
312  B(k, n), ldbk, /* ldb * Y */
313  zbeta, C(m, n), ldcm); /* ldc * Y */
314  }
315  else {
316  if (k == m) {
318  plasma->quark, &task_flags,
319  side, uplo,
320  tempmm, tempnn, A.mb,
321  alpha, A(k, k), ldak, /* ldak * K */
322  B(k, n), ldbk, /* ldb * Y */
323  zbeta, C(m, n), ldcm); /* ldc * Y */
324  }
325  else {
327  plasma->quark, &task_flags,
329  tempmm, tempnn, tempkm, A.mb,
330  alpha, A(m, k), ldam, /* lda * K */
331  B(k, n), ldbk, /* ldb * Y */
332  zbeta, C(m, n), ldcm); /* ldc * Y */
333  }
334  }
335  }
336  }
337  }
338  /*
339  * PlasmaRight / PlasmaLower
340  */
341  else {
342  ldan = BLKLDD(A, n);
343  ldbm = BLKLDD(B, m);
344  if (uplo == PlasmaLower) {
345  for (k = 0; k < C.nt; k++) {
346  tempkn = k == C.nt-1 ? C.n-k*C.nb : C.nb;
347  ldak = BLKLDD(A, k);
348  zbeta = k == 0 ? beta : zone;
349  if (k < n) {
351  plasma->quark, &task_flags,
353  tempmm, tempnn, tempkn, A.mb,
354  alpha, B(m, k), ldbm, /* ldb * K */
355  A(n, k), ldan, /* lda * K */
356  zbeta, C(m, n), ldcm); /* ldc * Y */
357  }
358  else {
359  if (k == n) {
361  plasma->quark, &task_flags,
362  side, uplo,
363  tempmm, tempnn, A.mb,
364  alpha, A(k, k), ldak, /* ldak * Y */
365  B(m, k), ldbm, /* ldb * Y */
366  zbeta, C(m, n), ldcm); /* ldc * Y */
367  }
368  else {
370  plasma->quark, &task_flags,
372  tempmm, tempnn, tempkn, A.mb,
373  alpha, B(m, k), ldbm, /* ldb * K */
374  A(k, n), ldak, /* ldak * Y */
375  zbeta, C(m, n), ldcm); /* ldc * Y */
376  }
377  }
378  }
379  }
380  /*
381  * PlasmaRight / PlasmaUpper
382  */
383  else {
384  for (k = 0; k < C.nt; k++) {
385  tempkn = k == C.nt-1 ? C.n-k*C.nb : C.nb;
386  ldak = BLKLDD(A, k);
387  zbeta = k == 0 ? beta : zone;
388  if (k < n) {
390  plasma->quark, &task_flags,
392  tempmm, tempnn, tempkn, A.mb,
393  alpha, B(m, k), ldbm, /* ldb * K */
394  A(k, n), ldak, /* ldak * Y */
395  zbeta, C(m, n), ldcm); /* ldc * Y */
396  }
397  else {
398  if (k == n) {
400  plasma->quark, &task_flags,
401  side, uplo,
402  tempmm, tempnn, A.mb,
403  alpha, A(k, k), ldak, /* ldak * Y */
404  B(m, k), ldbm, /* ldb * Y */
405  zbeta, C(m, n), ldcm); /* ldc * Y */
406  }
407  else {
409  plasma->quark, &task_flags,
411  tempmm, tempnn, tempkn, A.mb,
412  alpha, B(m, k), ldbm, /* ldb * K */
413  A(n, k), ldan, /* lda * K */
414  zbeta, C(m, n), ldcm); /* ldc * Y */
415  }
416  }
417  }
418  }
419  }
420  }
421  }
422 }