41{
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218 char * one, * top, * zero;
219 Int Acol, Aii, AisR, AisRow, Ajj, Ald, AmyprocD, AmyprocR,
220 AnprocsD, AprocR, Aroc, Arow, Bcol, Bii, Binb1D, BisR, BisRow,
221 Bjj, Bld, BmyprocD, BmyprocR, BnD, BnbD, BnpD, BnprocsD,
222 BprocD, BprocR, Broc, Brow, RRorCC, ctxt, k, kbb, kk, kn,
223 ktmp, mycol, mydist, myproc, myrow, npcol, nprow, p, size;
225
226
227
228 char * buf = NULL;
229
230
231
232
233
234
235
237
238
239
240 PB_Cinfog2l( IA, JA, DESCA, nprow, npcol, myrow, mycol, &Aii, &Ajj,
241 &Arow, &Acol );
242 if( ( AisRow = (
Mupcase( AROC[0] ) ==
CROW ) ) != 0 )
243 {
244 BnD = N; Ald = DESCA[
LLD_];
245 AmyprocD = mycol; AnprocsD = npcol; AmyprocR = myrow; AprocR = Arow;
246 AisR = ( ( Arow == -1 ) || ( nprow == 1 ) );
247 }
248 else
249 {
250 BnD = M; Ald = DESCA[
LLD_];
251 AmyprocD = myrow; AnprocsD = nprow; AmyprocR = mycol; AprocR = Acol;
252 AisR = ( ( Acol == -1 ) || ( npcol == 1 ) );
253 }
254
255
256
257 PB_Cinfog2l( IB, JB, DESCB, nprow, npcol, myrow, mycol, &Bii, &Bjj,
258 &Brow, &Bcol );
259 if( ( BisRow = (
Mupcase( BROC[0] ) ==
CROW ) ) != 0 )
260 {
261 BnbD = DESCB[
NB_]; Bld = DESCB[
LLD_];
262 BprocD = Bcol; BmyprocD = mycol; BnprocsD = npcol;
263 BprocR = Brow; BmyprocR = myrow;
264 BisR = ( ( BprocR == -1 ) || ( nprow == 1 ) );
266 }
267 else
268 {
269 BnbD = DESCB[
MB_]; Bld = DESCB[
LLD_];
270 BprocD = Brow; BmyprocD = myrow; BnprocsD = nprow;
271 BprocR = Bcol; BmyprocR = mycol;
272 BisR = ( ( BprocR == -1 ) || ( npcol == 1 ) );
274 }
275
276
277
278 RRorCC = ( ( AisRow && BisRow ) || ( !( AisRow ) && !( BisRow ) ) );
279
280
281
282 if( !( AisR ) )
283 {
284
285
286
287
288
289 if( BisR ) { BprocR = ( ( RRorCC ) ? AprocR : 0 ); }
290
291
292
293
295
296 if( ( AmyprocR == AprocR ) || ( BmyprocR == BprocR ) )
297 {
299
300
301
302 if( RRorCC )
303 {
305 else add =
TYPE->Fmmadd;
306
307 BnpD =
PB_Cnumroc( BnD, 0, Binb1D, BnbD, BmyprocD, BprocD,
308 BnprocsD );
309
310
311
312 if( AprocR == BprocR )
313 {
314
315
316
317 if( BnpD > 0 )
318 {
319 Broc = BprocD;
320 if( AisRow ) { kk = Bjj; ktmp = JA + N; kn = JA + Binb1D; }
321 else { kk = Bii; ktmp = IA + M; kn = IA + Binb1D; }
322
323 if( BmyprocD == Broc )
324 {
325 if( AisRow )
326 add( &M, &Binb1D, ALPHA,
Mptr( A, Aii, Ajj, Ald, size ),
327 &Ald, BETA,
Mptr( B, Bii, Bjj, Bld, size ), &Bld );
328 else
329 add( &Binb1D, &N, ALPHA,
Mptr( A, Aii, Ajj, Ald, size ),
330 &Ald, BETA,
Mptr( B, Bii, Bjj, Bld, size ), &Bld );
331 kk += Binb1D;
332 }
334
335 for( k = kn; k < ktmp; k += BnbD )
336 {
337 kbb = ktmp - k; kbb =
MIN( kbb, BnbD );
338
339 if( BmyprocD == Broc )
340 {
341 if( AisRow )
342 add( &M, &kbb, ALPHA,
Mptr( A, Aii, k, Ald, size ),
343 &Ald, BETA,
Mptr( B, Bii, kk, Bld, size ),
344 &Bld );
345 else
346 add( &kbb, &N, ALPHA,
Mptr( A, k, Ajj, Ald, size ),
347 &Ald, BETA,
Mptr( B, kk, Bjj, Bld, size ),
348 &Bld );
349 kk += kbb;
350 }
352 }
353 }
354 }
355 else
356 {
357
358
359
360 if( BmyprocR == BprocR )
361 {
362
363
364
365
366 if( BnpD > 0 )
367 {
368 if( BisRow )
369 {
371 TYPE->Cgerv2d( ctxt, M, BnpD, buf, M, AprocR,
372 BmyprocD );
373 add( &M, &BnpD, ALPHA, buf, &M, BETA,
Mptr( B, Bii, Bjj,
374 Bld, size ), &Bld );
375 if( buf ) free( buf );
376 }
377 else
378 {
380 TYPE->Cgerv2d( ctxt, BnpD, N, buf, BnpD, BmyprocD,
381 AprocR );
382 add( &BnpD, &N, ALPHA, buf, &BnpD, BETA,
Mptr( B, Bii,
383 Bjj, Bld, size ), &Bld );
384 if( buf ) free( buf );
385 }
386 }
387 }
388
389 if( AmyprocR == AprocR )
390 {
391
392
393
394
395 if( BnpD > 0 )
396 {
397 if( AisRow )
398 {
399 ktmp = JA + N;
400 kn = JA + Binb1D;
402 }
403 else
404 {
405 ktmp = IA + M;
406 kn = IA + Binb1D;
408 }
409 Broc = BprocD;
410 kk = 0;
411
412 if( BmyprocD == Broc )
413 {
414 if( AisRow )
415 add( &M, &Binb1D, one,
Mptr( A, Aii, Ajj, Ald,
416 size ), &Ald, zero, buf, &M );
417 else
418 add( &Binb1D, &N, one,
Mptr( A, Aii, Ajj, Ald,
419 size ), &Ald, zero, buf, &BnpD );
420 kk += Binb1D;
421 }
422
424 for( k = kn; k < ktmp; k += BnbD )
425 {
426 kbb = ktmp - k; kbb =
MIN( kbb, BnbD );
427
428 if( BmyprocD == Broc )
429 {
430 if( AisRow )
431 add( &M, &kbb, one,
Mptr( A, Aii, k, Ald, size ),
432 &Ald, zero,
Mptr( buf, 0, kk, M, size ),
433 &M );
434 else
435 add( &kbb, &N, one,
Mptr( A, k, Ajj, Ald, size ),
436 &Ald, zero,
Mptr( buf, kk, 0, BnpD, size ),
437 &BnpD );
438 kk += kbb;
439 }
441 }
442
443 if( AisRow )
444 TYPE->Cgesd2d( ctxt, M, BnpD, buf, M, BprocR,
445 AmyprocD );
446 else
447 TYPE->Cgesd2d( ctxt, BnpD, N, buf, BnpD, AmyprocD,
448 BprocR );
449 if( buf ) free( buf );
450 }
451 }
452 }
453 }
454 else
455 {
456
457
458
460 else add =
TYPE->Fmmtadd;
461
462 Aroc = 0;
463 if( AisRow ) { ktmp = JA + N; kn = JA + Binb1D; }
464 else { ktmp = IA + M; kn = IA + Binb1D; }
465
466
467
468
469 for( p = 0; p < BnprocsD; p++ )
470 {
471 mydist =
MModSub( p, BprocD, BnprocsD );
472 myproc =
MModAdd( BprocD, mydist, BnprocsD );
473
474 if( ( AprocR == p ) && ( BprocR == Aroc ) )
475 {
476 if( ( AmyprocR == p ) && ( AmyprocD == Aroc ) )
477 {
478
479
480
481 BnpD =
PB_Cnumroc( BnD, 0, Binb1D, BnbD, p, BprocD,
482 BnprocsD );
483 if( BnpD > 0 )
484 {
485 Broc = BprocD;
486 kk = ( AisRow ? Bii : Bjj );
487
488 if( myproc == Broc )
489 {
490 if( AisRow )
491 add( &M, &Binb1D, ALPHA,
Mptr( A, Aii, Ajj, Ald,
492 size ), &Ald, BETA,
Mptr( B, Bii, Bjj, Bld,
493 size ), &Bld );
494 else
495 add( &Binb1D, &N, ALPHA,
Mptr( A, Aii, Ajj, Ald,
496 size ), &Ald, BETA,
Mptr( B, Bii, Bjj, Bld,
497 size ), &Bld );
498 kk += Binb1D;
499 }
501
502 for( k = kn; k < ktmp; k += BnbD )
503 {
504 kbb = ktmp - k; kbb =
MIN( kbb, BnbD );
505 if( myproc == Broc )
506 {
507 if( AisRow )
508 add( &M, &kbb, ALPHA,
Mptr( A, Aii, k, Ald,
509 size ), &Ald, BETA,
Mptr( B, kk, Bjj, Bld,
510 size ), &Bld );
511 else
512 add( &kbb, &N, ALPHA,
Mptr( A, k, Ajj, Ald,
513 size ), &Ald, BETA,
Mptr( B, Bii, kk, Bld,
514 size ), &Bld );
515 kk += kbb;
516 }
518 }
519 }
520 }
521 }
522 else
523 {
524
525
526
527 if( ( BmyprocR == BprocR ) && ( BmyprocD == p ) )
528 {
529 BnpD =
PB_Cnumroc( BnD, 0, Binb1D, BnbD, p, BprocD,
530 BnprocsD );
531 if( BnpD > 0 )
532 {
533 if( AisRow )
534 {
536 TYPE->Cgerv2d( ctxt, BnpD, M, buf, BnpD, AprocR,
537 Aroc );
538 TYPE->Fmmadd( &BnpD, &M, ALPHA, buf, &BnpD, BETA,
539 Mptr( B, Bii, Bjj, Bld, size ), &Bld );
540 }
541 else
542 {
544 TYPE->Cgerv2d( ctxt, N, BnpD, buf, N, Aroc, AprocR );
545 TYPE->Fmmadd( &N, &BnpD, ALPHA, buf, &N, BETA,
546 Mptr( B, Bii, Bjj, Bld, size ), &Bld );
547 }
548 if( buf ) free( buf );
549 }
550 }
551
552 if( ( AmyprocR == AprocR ) && ( AmyprocD == Aroc ) )
553 {
554 BnpD =
PB_Cnumroc( BnD, 0, Binb1D, BnbD, p, BprocD,
555 BnprocsD );
556 if( BnpD > 0 )
557 {
558 if( AisRow )
560 else
562 Broc = BprocD;
563 kk = 0;
564
565 if( myproc == Broc )
566 {
567 if( AisRow )
568 add( &M, &Binb1D, one,
Mptr( A, Aii, Ajj, Ald,
569 size ), &Ald, zero, buf, &BnpD );
570 else
571 add( &Binb1D, &N, one,
Mptr( A, Aii, Ajj, Ald,
572 size ), &Ald, zero, buf, &N );
573 kk += Binb1D;
574 }
576
577 for( k = kn; k < ktmp; k += BnbD )
578 {
579 kbb = ktmp - k; kbb =
MIN( kbb, BnbD );
580 if( myproc == Broc )
581 {
582 if( AisRow )
583 add( &M, &kbb, one,
Mptr( A, Aii, k, Ald,
584 size ), &Ald, zero,
Mptr( buf, kk, 0,
585 BnpD, size ), &BnpD );
586 else
587 add( &kbb, &N, one,
Mptr( A, k, Ajj, Ald,
588 size ), &Ald, zero,
Mptr( buf, 0, kk,
589 N, size ), &N );
590 kk += kbb;
591 }
593 }
594 if( AisRow )
595 TYPE->Cgesd2d( ctxt, BnpD, M, buf, BnpD, p, BprocR );
596 else
597 TYPE->Cgesd2d( ctxt, N, BnpD, buf, N, BprocR, p );
598 if( buf ) free( buf );
599 }
600 }
601 }
603 }
604 }
605 }
606
607 if( BisR )
608 {
609
610
611
612 BnpD =
PB_Cnumroc( BnD, 0, Binb1D, BnbD, BmyprocD, BprocD, BnprocsD );
613 if( BnpD > 0 )
614 {
615 if( BisRow )
616 {
618 if( BmyprocR == BprocR )
619 TYPE->Cgebs2d( ctxt,
COLUMN, top, ( AisRow ? M : N ), BnpD,
620 Mptr( B, Bii, Bjj, Bld, size ), Bld );
621 else
622 TYPE->Cgebr2d( ctxt,
COLUMN, top, ( AisRow ? M : N ), BnpD,
623 Mptr( B, Bii, Bjj, Bld, size ), Bld, BprocR,
624 BmyprocD );
625 }
626 else
627 {
629 if( BmyprocR == BprocR )
630 TYPE->Cgebs2d( ctxt,
ROW, top, BnpD, ( AisRow ? M : N ),
631 Mptr( B, Bii, Bjj, Bld, size ), Bld );
632 else
633 TYPE->Cgebr2d( ctxt,
ROW, top, BnpD, ( AisRow ? M : N ),
634 Mptr( B, Bii, Bjj, Bld, size ), Bld, BmyprocD,
635 BprocR );
636 }
637 }
638 }
639 }
640 else
641 {
642
643
644
645
646 if( !( BisR ) && ( BmyprocR != BprocR ) ) return;
647
649
650 if( RRorCC )
651 {
653 else add =
TYPE->Fmmadd;
654 }
655 else
656 {
658 else add =
TYPE->Fmmtadd;
659 }
660
661 Broc = BprocD;
662 kk = ( BisRow ? Bjj : Bii );
663 if( AisRow ) { ktmp = JA + N; kn = JA + Binb1D; }
664 else { ktmp = IA + M; kn = IA + Binb1D; }
665
666 if( BmyprocD == Broc )
667 {
668 if( AisRow )
669 add( &M, &Binb1D, ALPHA,
Mptr( A, Aii, Ajj, Ald, size ), &Ald, BETA,
670 Mptr( B, Bii, Bjj, Bld, size ), &Bld );
671 else
672 add( &Binb1D, &N, ALPHA,
Mptr( A, Aii, Ajj, Ald, size ), &Ald, BETA,
673 Mptr( B, Bii, Bjj, Bld, size ), &Bld );
674 kk += Binb1D;
675 }
677
678 for( k = kn; k < ktmp; k += BnbD )
679 {
680 kbb = ktmp - k; kbb =
MIN( kbb, BnbD );
681 if( BmyprocD == Broc )
682 {
683 if( BisRow ) { buf =
Mptr( B, Bii, kk, Bld, size ); }
684 else { buf =
Mptr( B, kk, Bjj, Bld, size ); }
685 if( AisRow )
686 add( &M, &kbb, ALPHA,
Mptr( A, Aii, k, Ald, size ), &Ald, BETA,
687 buf, &Bld );
688 else
689 add( &kbb, &N, ALPHA,
Mptr( A, k, Ajj, Ald, size ), &Ald, BETA,
690 buf, &Bld );
691 kk += kbb;
692 }
694 }
695 }
696
697
698
699}