#include #include #define MAXNPES 16 #define MATRIXSIZE 8 #define NUMENTRY 3 typedef struct{ int nsnbrs,*spes; int nrnbrs,*rpes; int *sendptr,*recvptr,*sendind,*recvind; double *sendbuf,*recvbuf; }CommInfoType; main(int argc, char *argv[]) { int myrank,npes,i,j,r; int nlocal,*rowptr,*colind; double *values,*b,*y,*gb,*y2; double Dotproduct(int nlocal, double *x1, double *x2); CommInfoType cinfo; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &npes); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); nlocal=MATRIXSIZE/npes; y=(double*)malloc((nlocal)*sizeof(double)); y2=(double*)malloc((nlocal)*sizeof(double)); rowptr=(int*)malloc((nlocal+1)*sizeof(int)); b=(double*)malloc(nlocal*sizeof(double)); srand(myrank); srand48((myrank)*1.0); rowptr[0]=0; for(i=0;inrnbrs=ptr[0]=0; for(j=i=0;ik){ pes[cinfo->nrnbrs++]=i; ptr[cinfo->nrnbrs]=j; } } cinfo->rpes = (int *)malloc(cinfo->nrnbrs*sizeof(int)); cinfo->recvptr = (int *)malloc((cinfo->nrnbrs+1)*sizeof(int)); cinfo->recvind = (int *)malloc(nrecv*sizeof(int)); cinfo->recvbuf = (double *)malloc(nrecv*sizeof(double)); for(i=0;inrnbrs;i++) cinfo->rpes[i]=pes[i]; for(i=0;inrnbrs+1;i++) cinfo->recvptr[i]=ptr[i]; for(i=0;irecvind[i]=rentries[i]; receives=(int *)malloc(npes*sizeof(int)); sends=(int *)malloc(npes*sizeof(int)); for(i=0;inrnbrs;i++) receives[cinfo->rpes[i]]=cinfo->recvptr[i+1]-cinfo->recvptr[i]; MPI_Alltoall((void *)receives,1,MPI_INT,(void *)sends,1,MPI_INT,comm); cinfo->nsnbrs=ptr[0]=0; for(i=0;i0){ pes[cinfo->nsnbrs++]=i; ptr[cinfo->nsnbrs]=ptr[cinfo->nsnbrs-1]+sends[i]; } } nsend=ptr[cinfo->nsnbrs]; cinfo->spes=(int *)malloc(cinfo->nsnbrs*sizeof(int)); cinfo->sendptr=(int *)malloc((cinfo->nsnbrs+1)*sizeof(int)); cinfo->sendind=(int *)malloc(nsend*sizeof(int)); cinfo->sendbuf=(double *)malloc(nsend*sizeof(double)); for(i=0;insnbrs;i++) cinfo->spes[i]=pes[i]; for(i=0;insnbrs+1;i++) cinfo->sendptr[i]=ptr[i]; for(i=0;insnbrs;i++) MPI_Irecv((void *)(cinfo->sendind+cinfo->sendptr[i]), cinfo->sendptr[i+1]-cinfo->sendptr[i],MPI_INT, cinfo->spes[i],1,comm,rreq+i); for(i=0;inrnbrs;i++) MPI_Isend((void *)(cinfo->recvind+cinfo->recvptr[i]), cinfo->recvptr[i+1]-cinfo->recvptr[i],MPI_INT, cinfo->rpes[i],1,comm,sreq+i); MPI_Waitall(cinfo->nsnbrs,rreq,statuses); MPI_Waitall(cinfo->nrnbrs,sreq,statuses); free(rentries); free(pes); free(ptr); free(receives); free(sends); /* if(mype==2){ printf("my rank %d\n",mype); printf("nsnbrs %d",cinfo->nsnbrs); printf("\n spes "); for(i=0;insnbrs;i++)printf("%d",cinfo->spes[i]); printf("\n sendptr "); for(i=0;insnbrs+1;i++)printf("%d",cinfo->sendptr[i]); printf("\n sendind "); for(i=0;isendind[i]); }*/ /*for(i=0;inrnbrs;i++) MPI_Irecv((void *)(cinfo->recvbuf+cinfo->recvptr[i]), cinfo->recvptr[i+1]-cinfo->recvptr[i],MPI_DOUBLE, cinfo->rpes[i],1,comm,rreq+i); firstrow=mype*nlocal; for(i=0;isendptr[cinfo->nsnbrs];i++) cinfo->sendbuf[i]=b[cinfo->sendind[i]-firstrow]; for(i=0;insnbrs;i++) MPI_Isend((void *)(cinfo->sendbuf+cinfo->sendptr[i]), cinfo->sendptr[i+1]-cinfo->sendptr[i],MPI_DOUBLE, cinfo->spes[i],1,comm,sreq+i); MPI_Waitall(cinfo->nrnbrs,rreq,statuses); MPI_Waitall(cinfo->nsnbrs,sreq,statuses); for(i=0;irecvptr[cinfo->nrnbrs];i++) gb[cinfo->recvind[i]]=cinfo->recvbuf[i]; for(i=0;i