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
pcsymm.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 lda, ldak, ldb, ldc;
40  int tempmm, tempnn, tempkn, tempkm;
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 
69  ldc = BLKLDD(C, m);
70  /*
71  * PlasmaLeft / PlasmaLower
72  */
73  if (side == PlasmaLeft) {
74  lda = BLKLDD(A, m);
75  if (uplo == PlasmaLower) {
76  for (k = 0; k < C.mt; k++) {
77  tempkm = k == C.mt-1 ? C.m-k*C.mb : C.mb;
78  ldak = BLKLDD(A, k);
79  ldb = BLKLDD(B, k);
80  zbeta = k == 0 ? beta : zone;
81  if (k < m) {
82  CORE_cgemm(
84  tempmm, tempnn, tempkm,
85  alpha, A(m, k), lda,
86  B(k, n), ldb,
87  zbeta, C(m, n), ldc);
88  }
89  else {
90  if (k == m) {
91  CORE_csymm(
92  side, uplo,
93  tempmm, tempnn,
94  alpha, A(k, k), ldak,
95  B(k, n), ldb,
96  zbeta, C(m, n), ldc);
97  }
98  else {
99  CORE_cgemm(
101  tempmm, tempnn, tempkm,
102  alpha, A(k, m), ldak,
103  B(k, n), ldb,
104  zbeta, C(m, n), ldc);
105  }
106  }
107  }
108  }
109  /*
110  * PlasmaLeft / PlasmaUpper
111  */
112  else {
113  for (k = 0; k < C.mt; k++) {
114  tempkm = k == C.mt-1 ? C.m-k*C.mb : C.mb;
115  ldak = BLKLDD(A, k);
116  ldb = BLKLDD(B, k);
117  zbeta = k == 0 ? beta : zone;
118  if (k < m) {
119  CORE_cgemm(
121  tempmm, tempnn, tempkm,
122  alpha, A(k, m), ldak,
123  B(k, n), ldb,
124  zbeta, C(m, n), ldc);
125  }
126  else {
127  if (k == m) {
128  CORE_csymm(
129  side, uplo,
130  tempmm, tempnn,
131  alpha, A(k, k), ldak,
132  B(k, n), ldb,
133  zbeta, C(m, n), ldc);
134  }
135  else {
136  CORE_cgemm(
138  tempmm, tempnn, tempkm,
139  alpha, A(m, k), lda,
140  B(k, n), ldb,
141  zbeta, C(m, n), ldc);
142  }
143  }
144  }
145  }
146  }
147  /*
148  * PlasmaRight / PlasmaLower
149  */
150  else {
151  lda = BLKLDD(A, n);
152  ldb = BLKLDD(B, m);
153  if (uplo == PlasmaLower) {
154  for (k = 0; k < C.nt; k++) {
155  tempkn = k == C.nt-1 ? C.n-k*C.nb : C.nb;
156  ldak = BLKLDD(A, k);
157  zbeta = k == 0 ? beta : zone;
158  if (k < n) {
159  CORE_cgemm(
161  tempmm, tempnn, tempkn,
162  alpha, B(m, k), ldb,
163  A(n, k), lda,
164  zbeta, C(m, n), ldc);
165  }
166  else {
167  if (n == k) {
168  CORE_csymm(
169  side, uplo,
170  tempmm, tempnn,
171  alpha, A(k, k), ldak,
172  B(m, k), ldb,
173  zbeta, C(m, n), ldc);
174  }
175  else {
176  CORE_cgemm(
178  tempmm, tempnn, tempkn,
179  alpha, B(m, k), ldb,
180  A(k, n), ldak,
181  zbeta, C(m, n), ldc);
182  }
183  }
184  }
185  }
186  /*
187  * PlasmaRight / PlasmaUpper
188  */
189  else {
190  for (k = 0; k < C.nt; k++) {
191  tempkn = k == C.nt-1 ? C.n-k*C.nb : C.nb;
192  ldak = BLKLDD(A, k);
193  zbeta = k == 0 ? beta : zone;
194  if (k < n) {
195  CORE_cgemm(
197  tempmm, tempnn, tempkn,
198  alpha, B(m, k), ldb,
199  A(k, n), ldak,
200  zbeta, C(m, n), ldc);
201  }
202  else {
203  if (n == k) {
204  CORE_csymm(
205  side, uplo,
206  tempmm, tempnn,
207  alpha, A(k, k), ldak,
208  B(m, k), ldb,
209  zbeta, C(m, n), ldc);
210  }
211  else {
212  CORE_cgemm(
214  tempmm, tempnn, tempkn,
215  alpha, B(m, k), ldb,
216  A(n, k), lda,
217  zbeta, C(m, n), ldc);
218  }
219  }
220  }
221  }
222  }
223  m = next_m;
224  n = next_n;
225  }
226 }
227 
228 /***************************************************************************/
234  PLASMA_sequence *sequence, PLASMA_request *request)
235 {
238 
239  int k, m, n;
240  int lda, ldak, ldb, ldc;
241  int tempmm, tempnn, tempkn, tempkm;
242 
243  PLASMA_Complex32_t zbeta;
245 
246  plasma = plasma_context_self();
247  if (sequence->status != PLASMA_SUCCESS)
248  return;
249  QUARK_Task_Flag_Set(&task_flags, TASK_SEQUENCE, (intptr_t)sequence->quark_sequence);
250 
251  for (m = 0; m < C.mt; m++) {
252  tempmm = m == C.mt-1 ? C.m-m*C.mb : C.mb;
253  ldc = BLKLDD(C, m);
254  for (n = 0; n < C.nt; n++) {
255  tempnn = n == C.nt-1 ? C.n-n*C.nb : C.nb;
256  /*
257  * PlasmaLeft / PlasmaLower
258  */
259  if (side == PlasmaLeft) {
260  lda = BLKLDD(A, m);
261  if (uplo == PlasmaLower) {
262  for (k = 0; k < C.mt; k++) {
263  tempkm = k == C.mt-1 ? C.m-k*C.mb : C.mb;
264  ldak = BLKLDD(A, k);
265  ldb = BLKLDD(B, k);
266  zbeta = k == 0 ? beta : zone;
267  if (k < m) {
269  plasma->quark, &task_flags,
271  tempmm, tempnn, tempkm, A.mb,
272  alpha, A(m, k), lda, /* lda * K */
273  B(k, n), ldb, /* ldb * Y */
274  zbeta, C(m, n), ldc); /* ldc * Y */
275  }
276  else {
277  if (k == m) {
279  plasma->quark, &task_flags,
280  side, uplo,
281  tempmm, tempnn, A.mb,
282  alpha, A(k, k), ldak, /* ldak * X */
283  B(k, n), ldb, /* ldb * Y */
284  zbeta, C(m, n), ldc); /* ldc * Y */
285  }
286  else {
288  plasma->quark, &task_flags,
290  tempmm, tempnn, tempkm, A.mb,
291  alpha, A(k, m), ldak, /* ldak * X */
292  B(k, n), ldb, /* ldb * Y */
293  zbeta, C(m, n), ldc); /* ldc * Y */
294  }
295  }
296  }
297  }
298  /*
299  * PlasmaLeft / PlasmaUpper
300  */
301  else {
302  for (k = 0; k < C.mt; k++) {
303  tempkm = k == C.mt-1 ? C.m-k*C.mb : C.mb;
304  ldak = BLKLDD(A, k);
305  ldb = BLKLDD(B, k);
306  zbeta = k == 0 ? beta : zone;
307  if (k < m) {
309  plasma->quark, &task_flags,
311  tempmm, tempnn, tempkm, A.mb,
312  alpha, A(k, m), ldak, /* ldak * X */
313  B(k, n), ldb, /* ldb * Y */
314  zbeta, C(m, n), ldc); /* ldc * Y */
315  }
316  else {
317  if (k == m) {
319  plasma->quark, &task_flags,
320  side, uplo,
321  tempmm, tempnn, A.mb,
322  alpha, A(k, k), ldak, /* ldak * K */
323  B(k, n), ldb, /* ldb * Y */
324  zbeta, C(m, n), ldc); /* ldc * Y */
325  }
326  else {
328  plasma->quark, &task_flags,
330  tempmm, tempnn, tempkm, A.mb,
331  alpha, A(m, k), lda, /* lda * K */
332  B(k, n), ldb, /* ldb * Y */
333  zbeta, C(m, n), ldc); /* ldc * Y */
334  }
335  }
336  }
337  }
338  }
339  /*
340  * PlasmaRight / PlasmaLower
341  */
342  else {
343  lda = BLKLDD(A, n);
344  ldb = BLKLDD(B, m);
345  if (uplo == PlasmaLower) {
346  for (k = 0; k < C.nt; k++) {
347  tempkn = k == C.nt-1 ? C.n-k*C.nb : C.nb;
348  ldak = BLKLDD(A, k);
349  zbeta = k == 0 ? beta : zone;
350  if (k < n) {
352  plasma->quark, &task_flags,
354  tempmm, tempnn, tempkn, A.mb,
355  alpha, B(m, k), ldb, /* ldb * K */
356  A(n, k), lda, /* lda * K */
357  zbeta, C(m, n), ldc); /* ldc * Y */
358  }
359  else {
360  if (k == n) {
362  plasma->quark, &task_flags,
363  side, uplo,
364  tempmm, tempnn, A.mb,
365  alpha, A(k, k), ldak, /* ldak * Y */
366  B(m, k), ldb, /* ldb * Y */
367  zbeta, C(m, n), ldc); /* ldc * Y */
368  }
369  else {
371  plasma->quark, &task_flags,
373  tempmm, tempnn, tempkn, A.mb,
374  alpha, B(m, k), ldb, /* ldb * K */
375  A(k, n), ldak, /* ldak * Y */
376  zbeta, C(m, n), ldc); /* ldc * Y */
377  }
378  }
379  }
380  }
381  /*
382  * PlasmaRight / PlasmaUpper
383  */
384  else {
385  for (k = 0; k < C.nt; k++) {
386  tempkn = k == C.nt-1 ? C.n-k*C.nb : C.nb;
387  ldak = BLKLDD(A, k);
388  zbeta = k == 0 ? beta : zone;
389  if (k < n) {
391  plasma->quark, &task_flags,
393  tempmm, tempnn, tempkn, A.mb,
394  alpha, B(m, k), ldb, /* ldb * K */
395  A(k, n), ldak, /* ldak * Y */
396  zbeta, C(m, n), ldc); /* ldc * Y */
397  }
398  else {
399  if (k == n) {
401  plasma->quark, &task_flags,
402  side, uplo,
403  tempmm, tempnn, A.mb,
404  alpha, A(k, k), ldak, /* ldak * Y */
405  B(m, k), ldb, /* ldb * Y */
406  zbeta, C(m, n), ldc); /* ldc * Y */
407  }
408  else {
410  plasma->quark, &task_flags,
412  tempmm, tempnn, tempkn, A.mb,
413  alpha, B(m, k), ldb, /* ldb * K */
414  A(n, k), lda, /* lda * K */
415  zbeta, C(m, n), ldc); /* ldc * Y */
416  }
417  }
418  }
419  }
420  }
421  }
422  }
423 }