40{
41
42
43
44 char * negone, * one;
45 Int Acol, Acurcol, Acurrow, Aii, Aimb, Aimb1, Ainb, Ainb1, Ajj,
46 Ald, Almb1, Alnb1, Amb, Amp0, An, Anb, Anq0, Anxtrow, Anxtcol,
47 Arow, Bcol, Bii, Bimb, Binb, Bjj, Bld, Bmb, Bmp0, Bnb, Bnq0,
48 Brow, Cld, ctxt, k=1, kb, kblks, lside, mycol, myrow, npcol,
49 nprow, size, upper;
55
56
57
58 char * Aptr = NULL, * Aptr0 = NULL, * Bptr = NULL, * Bptr0 = NULL,
59 * Cptr = NULL;
60
61
62
63
66
67
68
70
71
72
74 PB_Cinfog2l( IA, JA, DESCA, nprow, npcol, myrow, mycol, &Aii, &Ajj,
75 &Arow, &Acol );
76
77
78
79 Bimb = DESCB[
IMB_]; Binb = DESCB[
INB_];
80 Bmb = DESCB[
MB_ ]; Bnb = DESCB[
NB_ ]; Bld = DESCB[
LLD_];
81 PB_Cinfog2l( IB, JB, DESCB, nprow, npcol, myrow, mycol, &Bii, &Bjj,
82 &Brow, &Bcol );
83
84
85
86 if( lside )
87 {
89 if( Bnq0 <= 0 ) return;
90
92
94 {
95 if( Bmp0 > 0 )
96 {
97 Bptr0 =
Mptr( B, Bii, Bjj, Bld, size );
98 TYPE->Fmmadd( &M, &Bnq0,
TYPE->negone, C, &DESCC[
LLD_], ALPHA,
99 Bptr0, &Bld );
102 Ajj, Ald, size ), &Ald, Bptr0, &Bld );
103 }
104 return;
105 }
106 if( Bmp0 > 0 ) Bptr0 =
Mptr( B, Bii, Bjj, Bld, size );
107 }
108 else
109 {
111 if( Bmp0 <= 0 ) return;
112
114
116 {
117 if( Bnq0 > 0 )
118 {
119 Bptr0 =
Mptr( B, Bii, Bjj, Bld, size );
120 TYPE->Fmmadd( &Bmp0, &N,
TYPE->negone, C, &DESCC[
LLD_], ALPHA,
121 Bptr0, &Bld );
124 Ajj, Ald, size ), &Ald, Bptr0, &Bld );
125 }
126 return;
127 }
128 if( Bnq0 > 0 ) Bptr0 =
Mptr( B, Bii, Bjj, Bld, size );
129 }
130
131
132
133 An = ( lside ? M : N );
135 negone =
TYPE->negone; one =
TYPE->one;
136 recv =
TYPE->Cgerv2d; send =
TYPE->Cgesd2d;
137 mmadd =
TYPE->Fmmadd; gemm =
TYPE->Fgemm; trsm =
TYPE->Ftrsm;
138
139
140
141 Aimb = DESCA[
IMB_]; Ainb = DESCA[
INB_];
142 Amb = DESCA[
MB_ ]; Anb = DESCA[
NB_ ];
145 Amp0 =
PB_Cnumroc( An, 0, Aimb1, Amb, myrow, Arow, nprow );
148 Anq0 =
PB_Cnumroc( An, 0, Ainb1, Anb, mycol, Acol, npcol );
149 if( ( Amp0 > 0 ) && ( Anq0 > 0 ) ) Aptr0 =
Mptr( A, Aii, Ajj, Ald, size );
150
152
153 if( lside )
154 {
155 kblks = ( An > Aimb1 ? ( An - Aimb1 - 1 ) / Amb + 2 : 1 );
156
157 if( upper )
158 {
159 Acurrow = Arow;
160 Anxtrow =
MModAdd1( Acurrow, nprow );
161 Aptr = Aptr0;
162 Bptr = Bptr0;
163 Cptr = C;
164
165 while( k <= kblks )
166 {
167 kb = ( k == 1 ? Aimb1 : ( k == kblks ? Almb1 : Amb ) );
168 An -= kb;
169
170 if( myrow == Acurrow )
171 {
172
173
174
175
176 mmadd( &kb, &Bnq0, negone, Cptr, &Cld, ALPHA, Bptr, &Bld );
177
178
179
181 C2F_CHAR( DIAG ), &kb, &Bnq0, one, Aptr, &Ald, Bptr,
182 &Bld );
183
184
185
186
187
188 if( An > 0 )
189 {
191 one,
Mptr( Aptr, 0, kb, Ald, size ), &Ald, Bptr, &Bld,
192 one,
Mptr( Cptr, kb, 0, Cld, size ), &Cld );
193 send( ctxt, An, Bnq0,
Mptr( Cptr, kb, 0, Cld, size ), Cld,
194 Anxtrow, mycol );
195 }
196 Aptr =
Mptr( Aptr, kb, 0, Ald, size );
197 Bptr =
Mptr( Bptr, kb, 0, Bld, size );
198 Cptr = C;
199 }
200 else if( myrow == Anxtrow )
201 {
202
203
204
205
206 if( An > 0 ) recv( ctxt, An, Bnq0, Cptr, Cld, Acurrow, mycol );
207 }
208
209 Aptr =
Mptr( Aptr, 0, kb, Ald, size );
210 Acurrow = Anxtrow;
211 Anxtrow =
MModAdd1( Acurrow, nprow );
212 k += 1;
213 }
214 }
215 else
216 {
217 k = kblks;
218 Acurrow =
PB_Cindxg2p( An-1, Aimb1, Amb, Arow, Arow, nprow );
219 Anxtrow =
MModSub1( Acurrow, nprow );
220
221 while( k > 0 )
222 {
223 kb = ( k == 1 ? Aimb1 : ( k == kblks ? Almb1 : Amb ) );
224 An -= kb;
225
226 if( myrow == Acurrow )
227 {
228 Aptr =
Mptr( Aptr0, Amp0 - kb, 0, Ald, size );
229 Bptr =
Mptr( Bptr0, Bmp0 - kb, 0, Bld, size );
230 Cptr =
Mptr( C, An, 0, Cld, size );
231
232
233
234
235 mmadd( &kb, &Bnq0, negone, Cptr, &Cld, ALPHA, Bptr, &Bld );
236
237
238
240 C2F_CHAR( DIAG ), &kb, &Bnq0, one,
Mptr( Aptr, 0, Anq0-kb,
241 Ald, size ), &Ald, Bptr, &Bld );
242
243
244
245
246
247 if( An > 0 )
248 {
250 one, Aptr, &Ald, Bptr, &Bld, one, C, &Cld );
251 send( ctxt, An, Bnq0, C, Cld, Anxtrow, mycol );
252 }
253 Amp0 -= kb;
254 Bmp0 -= kb;
255 }
256 else if( myrow == Anxtrow )
257 {
258
259
260
261
262 if( An > 0 ) recv( ctxt, An, Bnq0, C, Cld, Acurrow, mycol );
263 }
264
265 Anq0 -= kb;
266 Acurrow = Anxtrow;
267 Anxtrow =
MModSub1( Acurrow, nprow );
268 k -= 1;
269 }
270 }
271 }
272 else
273 {
274 kblks = ( An > Ainb1 ? ( An - Ainb1 - 1 ) / Anb + 2 : 1 );
275
276 if( upper )
277 {
278 k = kblks;
279 Acurcol =
PB_Cindxg2p( An-1, Ainb1, Anb, Acol, Acol, npcol );
280 Anxtcol =
MModSub1( Acurcol, npcol );
281
282 while( k > 0 )
283 {
284 kb = ( k == 1 ? Ainb1 : ( k == kblks ? Alnb1 : Anb ) );
285 An -= kb;
286
287 if( mycol == Acurcol )
288 {
289 Aptr =
Mptr( Aptr0, 0, Anq0 - kb, Ald, size );
290 Bptr =
Mptr( Bptr0, 0, Bnq0 - kb, Bld, size );
291 Cptr =
Mptr( C, 0, An, Cld, size );
292
293
294
295
296 mmadd( &Bmp0, &kb, negone, Cptr, &Cld, ALPHA, Bptr, &Bld );
297
298
299
301 C2F_CHAR( DIAG ), &Bmp0, &kb, one,
Mptr( Aptr, Amp0-kb, 0,
302 Ald, size ), &Ald, Bptr, &Bld );
303
304
305
306
307
308 if( An > 0 )
309 {
311 one, Bptr, &Bld, Aptr, &Ald, one, C, &Cld );
312 send( ctxt, Bmp0, An, C, Cld, myrow, Anxtcol );
313 }
314 Anq0 -= kb;
315 Bnq0 -= kb;
316 }
317 else if( mycol == Anxtcol )
318 {
319
320
321
322
323 if( An > 0 ) recv( ctxt, Bmp0, An, C, Cld, myrow, Acurcol );
324 }
325
326 Amp0 -= kb;
327 Acurcol = Anxtcol;
328 Anxtcol =
MModSub1( Acurcol, npcol );
329 k -= 1;
330 }
331 }
332 else
333 {
334 Acurcol = Acol;
335 Anxtcol =
MModAdd1( Acurcol, npcol );
336 Aptr = Aptr0;
337 Bptr = Bptr0;
338 Cptr = C;
339
340 while( k <= kblks )
341 {
342 kb = ( k == 1 ? Ainb1 : ( k == kblks ? Alnb1 : Anb ) );
343 An -= kb;
344
345 if( mycol == Acurcol )
346 {
347
348
349
350
351 mmadd( &Bmp0, &kb, negone, Cptr, &Cld, ALPHA, Bptr, &Bld );
352
353
354
356 C2F_CHAR( DIAG ), &Bmp0, &kb, one, Aptr, &Ald, Bptr,
357 &Bld );
358
359
360
361
362
363 if( An > 0 )
364 {
366 one, Bptr, &Bld,
Mptr( Aptr, kb, 0, Ald, size ), &Ald,
367 one,
Mptr( Cptr, 0, kb, Cld, size ), &Cld );
368 send( ctxt, Bmp0, An,
Mptr( Cptr, 0, kb, Cld, size ), Cld,
369 myrow, Anxtcol );
370 }
371 Aptr =
Mptr( Aptr, 0, kb, Ald, size );
372 Bptr =
Mptr( Bptr, 0, kb, Bld, size );
373 Cptr = C;
374 }
375 else if( mycol == Anxtcol )
376 {
377
378
379
380
381 if( An > 0 ) recv( ctxt, Bmp0, An, Cptr, Cld, myrow, Acurcol );
382 }
383
384 Aptr =
Mptr( Aptr, kb, 0, Ald, size );
385 Acurcol = Anxtcol;
386 Anxtcol =
MModAdd1( Acurcol, npcol );
387 k += 1;
388 }
389 }
390 }
391
392
393
394}