I am wondering if my 2-D block cyclic distribution is correct, which I need for the pdgemm routine.
In the ScaLapack user's guide, the following is mentioned:
"Every process owns a collection of blocks, which are contiguously stored by column in a two-dimensional ``column major'' array."
Is this manner of storage only true for Fortaran code?
or is it also true for C code?
I am a C user and I am using the following code to make a 2-D block cyclic distribution of two matrices A and B of size n*n each. Would you tell me if it is a good distribution
- Code: Select all
if(mycol==0 && myrow==0)
{
if(n%nb==0)
blocks=n/nb;
else
blocks=n/nb+1;
for(rowproc=0;rowproc<nprow;rowproc++)
for(colproc=0;colproc<npcol;colproc++)
{
rows=numroc_(&n,&nb,&rowproc,&zero,&nprow);
cols=numroc_(&n,&nb,&colproc,&zero,&npcol);
for(jstart=colproc*nb,cb=colproc,jl=0;cb<blocks;cb+=nprow,jstart+=npcol*nb)
for(k2=0;k2<nb && k2+jstart<n;k2++,jl++)
for(istart=rowproc*nb,rb=rowproc,il=0;rb<blocks;rb+=nprow,istart+=nprow*nb)
for(k1=0;k1<nb && k1+istart<n;k1++,il++)
if(rowproc!=0||colproc!=0)
{
SA[jl*rows+il]=A[(jstart+k2)*n+(istart+k1)];
SB[jl*rows+il]=B[(jstart+k2)*n+(istart+k1)];
}
else
{
myA[jl*rows+il]=A[(jstart+k2)*n+(istart+k1)];
myB[jl*rows+il]=B[(jstart+k2)*n+(istart+k1)];
}
if(rowproc!=0||colproc!=0)
{
Cdgesd2d(ictxt,rows,cols,SA,rows,rowproc,colproc);
Cdgesd2d(ictxt,rows,cols,SB,rows,rowproc,colproc);
}
}
}
else
{
rows=numroc_(&n,&nb,&myrow,&zero,&nprow);
cols=numroc_(&n,&nb,&mycol,&zero,&npcol);
Cdgerv2d(ictxt,rows,cols,myA,rows,0,0);
Cdgerv2d(ictxt,rows,cols,myB,rows,0,0);
}
Thanks in advance
alex

