|
ScaLAPACK
2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
|
#include "Bdef.h"Go to the source code of this file.
Functions/Subroutines | |
| void | BI_MpathBR (BLACSCONTEXT *ctxt, BLACBUFF *bp, SDRVPTR send, int src, int npaths) |
| void BI_MpathBR | ( | BLACSCONTEXT * | ctxt, |
| BLACBUFF * | bp, | ||
| SDRVPTR | send, | ||
| int | src, | ||
| int | npaths | ||
| ) |
Definition at line 3 of file BI_MpathBR.c.
{
void BI_Arecv(BLACSCONTEXT *, int, int, BLACBUFF *);
int BI_BuffIsFree(BLACBUFF *, int);
int pathlen; /* the minimal length of each path */
int mydist; /* my distance from src */
int faredge; /* node at far end of path */
int lastlong; /* distance to node on end of last path with extra node */
int Np, Iam, msgid, Np_1, dest;
msgid = Mscopeid(ctxt);
BI_Arecv(ctxt, BANYNODE, msgid, bp);
Np = ctxt->scp->Np;
Iam = ctxt->scp->Iam;
Np_1 = Np - 1;
if (npaths == FULLCON) npaths = Np_1;
if (npaths > 0)
{
dest = (Iam+1) % Np;
mydist = (Np + Iam - src) % Np;
}
else
{
dest = (Np_1+Iam) % Np;
mydist = (Np + src - Iam) % Np;
npaths = -npaths;
}
/*
* Make sure npaths is cool
*/
if (npaths > Np_1) npaths = Np_1;
pathlen = Np_1 / npaths;
lastlong = (Np_1%npaths) * (pathlen+1);
if (lastlong)
{
if (mydist <= lastlong) faredge = ((mydist-1)/(pathlen+1)+1)*(pathlen+1);
else faredge = ((lastlong-1)/(pathlen+1)+1) * (pathlen+1)
+ ((mydist-lastlong-1)/pathlen + 1) * pathlen;
}
else faredge = ((mydist-1)/pathlen + 1) * pathlen;
BI_BuffIsFree(bp, 1); /* wait for recv to complete */
if (mydist < faredge) send(ctxt, dest, msgid, bp);
}