297{
298 float *ptrsendbuff, *ptrrecvbuff, *ptrNULL = 0;
299 float *recvptr;
301 Int *proc0, *proc1, *param;
302 Int mypnum, myprow0, mypcol0, myprow1, mypcol1,
nprocs;
304 Int nprow, npcol, gcontext;
305 Int recvsize, sendsize;
308 Int hinter_nb, vinter_nb;
312
313
314
315 if (m == 0 ||
n == 0)
316 return;
317 ia -= 1;
318 ja -= 1;
319 ib -= 1;
320 jb -= 1;
322 gcontext = globcontext;
324
325
326
327 if (nprow != 1) {
330 }
332
333 if (myprow0 >= p0 || mypcol0 >= q0)
334 myprow0 = mypcol0 = -1;
335 assert((myprow0 < p0 && mypcol0 < q0) || (myprow0 == -1 && mypcol0 == -1));
337 if (myprow1 >= p1 || mypcol1 >= q1)
338 myprow1 = mypcol1 = -1;
339 assert((myprow1 < p1 && mypcol1 < q1) || (myprow1 == -1 && mypcol1 == -1));
340
341
349
350
351 if (myprow0 >= 0) {
352 proc0[myprow0 * q0 + mypcol0] = mypnum;
353 param[0] = p0;
354 param[1] = q0;
357 param[6] = ma->
nbrow;
358 param[7] = ma->
nbcol;
359 param[8] = ma->
sprow;
360 param[9] = ma->
spcol;
361 param[10] = ia;
362 param[11] = ja;
363 }
364 if (myprow1 >= 0) {
365 proc1[myprow1 * q1 + mypcol1] = mypnum;
366 param[2] = p1;
367 param[3] = q1;
370 param[14] = mb->
nbrow;
371 param[15] = mb->
nbcol;
372 param[16] = mb->
sprow;
373 param[17] = mb->
spcol;
374 param[18] = ib;
375 param[19] = jb;
376 }
377 printf("Aproc0 = {%d,%d}\n", proc0[0], proc0[1]);
378 printf("Aproc1 = {%d,%d}\n", proc1[0], proc1[1]);
381 printf("Bproc0 = {%d,%d}\n", proc0[0], proc0[1]);
382 printf("Bproc1 = {%d,%d}\n", proc1[0], proc1[1]);
383 newa = *ma;
384 newb = *mb;
385 ma = &newa;
386 mb = &newb;
387 if (myprow0 == -1) {
388 p0 = param[0];
389 q0 = param[1];
392 ma->
nbrow = param[6];
393 ma->
nbcol = param[7];
394 ma->
sprow = param[8];
395 ma->
spcol = param[9];
396 ia = param[10];
397 ja = param[11];
398 }
399 if (myprow1 == -1) {
400 p1 = param[2];
401 q1 = param[3];
404 mb->
nbrow = param[14];
405 mb->
nbcol = param[15];
406 mb->
sprow = param[16];
407 mb->
spcol = param[17];
408 ib = param[18];
409 jb = param[19];
410 }
411 for (i = 0; i <
NBPARAM; i++) {
413 fprintf(stderr, "xxGEMR2D:something wrong in the parameters\n");
414 exit(1);
415 }
416 }
417#ifndef NDEBUG
418 for (i = 0; i < p0 * q0; i++)
419 assert(proc0[i] >= 0 && proc0[i] < nprocs);
420 for (i = 0; i < p1 * q1; i++)
421 assert(proc1[i] >= 0 && proc1[i] < nprocs);
422#endif
423
426
427 {
431 ptrmyblock += decal;
434 ptrmyblock += decal * ma->
lda;
439 ptrmynewblock += decal;
442 ptrmynewblock += decal * mb->
lda;
445 if (p0 == 1)
447 if (q0 == 1)
449 if (p1 == 1)
451 if (q1 == 1)
453#ifndef NDEBUG
456#endif
457 }
458
459
460 if (myprow0 >= 0 && mypcol0 >= 0) {
461
463 };
464 if (myprow1 >= 0 && mypcol1 >= 0) {
465
467 };
468
469
470
475
476
477
478
479
480 recvptr = ptrrecvbuff;
481 {
482 Int tot, myrang, step, sens;
483 Int *sender, *recver;
484 Int mesending, merecving;
485 tot =
max(p0 * q0, p1 * q1);
486 init_chenille(mypnum, nprocs, p0 * q0, proc0, p1 * q1, proc1,
487 &sender, &recver, &myrang);
488 if (myrang == -1)
489 goto after_comm;
490 mesending = myprow0 >= 0;
491 assert(sender[myrang] >= 0 || !mesending);
492 assert(!mesending || proc0[sender[myrang]] == mypnum);
493 merecving = myprow1 >= 0;
494 assert(recver[myrang] >= 0 || !merecving);
495 assert(!merecving || proc1[recver[myrang]] == mypnum);
496 step = tot - 1 - myrang;
497 do {
498 for (sens = 0; sens < 2; sens++) {
499
500
501 if (mesending && recver[step] >= 0 &&
502 (sens == 0)) {
503 i = recver[step] / q1;
504 j = recver[step] % q1;
505 vinter_nb =
scan_intervals(
'r', ia, ib, m, ma, mb, p0, p1, myprow0, i,
506 v_inter);
507 hinter_nb =
scan_intervals(
'c', ja, jb,
n, ma, mb, q0, q1, mypcol0, j,
508 h_inter);
509 sendsize =
block2buff(v_inter, vinter_nb, h_inter, hinter_nb,
510 ptrmyblock, ma, ptrsendbuff);
511 }
512 if (mesending && recver[step] >= 0 &&
513 (sens == myrang > step)) {
514 i = recver[step] / q1;
515 j = recver[step] % q1;
516 if (sendsize > 0
517 && (step != myrang || !merecving)
518 ) {
519 Csgesd2d(gcontext, sendsize, (
Int)1, ptrsendbuff, sendsize,
520 (
Int)0, proc1[i * q1 + j]);
521 }
522 }
523 if (merecving && sender[step] >= 0 &&
524 (sens == myrang <= step)) {
525 i = sender[step] / q0;
526 j = sender[step] % q0;
527 vinter_nb =
scan_intervals(
'r', ib, ia, m, mb, ma, p1, p0, myprow1, i,
528 v_inter);
529 hinter_nb =
scan_intervals(
'c', jb, ja,
n, mb, ma, q1, q0, mypcol1, j,
530 h_inter);
531 recvsize =
inter_len(hinter_nb, h_inter, vinter_nb, v_inter);
532 if (recvsize > 0) {
533 if (step == myrang && mesending) {
535 ptrsendbuff, recvsize,
536 ptrrecvbuff, recvsize);
537 } else {
538 Csgerv2d(gcontext, recvsize, (
Int)1, ptrrecvbuff, recvsize,
539 0, proc0[i * q0 + j]);
540 }
541 }
542 }
543 if (merecving && sender[step] >= 0 && sens == 1) {
544 buff2block(v_inter, vinter_nb, h_inter, hinter_nb,
545 recvptr, ptrmynewblock, mb);
546 }
547 }
548 step -= 1;
549 if (step < 0)
550 step = tot - 1;
551 } while (step != tot - 1 - myrang);
552after_comm:
553 free(sender);
554 }
555
556 if (myprow1 >= 0 && mypcol1 >= 0) {
558 };
559 if (myprow0 >= 0 && mypcol0 >= 0) {
561 };
562 if (nprow != 1)
564 free(v_inter);
565 free(h_inter);
566 free(param);
integer, save, private nprocs
static2 void gridreshape()
static2 void buff2block()
static2 void init_chenille()