(DSM - Distributed Shared Memory)
, . ( ). DSM - , () . DSM , . DSM , . , . , , SMP, . , . , , . NUMA (non-uniformmemoryaccess).
MPI_White(), MPI_Probe.
. MPI_Wait
intMPI_Wait(MPI_Request *request, MPI_Status *status)
request ; status . . , request. status .
MPI_Probe.
intMPI_Probe(int source, int tag, MPI_Commcomm, MPI_Status *status)
source -; tag ; comm ; status . MPI_Probe , , -
. status. MPI_Probe MPI_Recv ( -, ) , MPI_Probe.
3. ққ ң.
1. ? ғ ? ғ ғ.
MPI , , MIMD. , , . MPI. , MPI . , MPI. MPI . . `` '' (`` thread-safe''). MPI , MPI, ; MPI , . MPI . , . ; , ; . , MPI ( ), . , , . . 0,..., groupsize-1.
|
|
2.MPI- ғ. MPI_Barrier() .
. , , . , , .
. - , , , , ( ) =>intMPI_Barrier(MPI_Commcomm) - , comm . MPI_Barrier, . , , , . , , . .
3. 3 ө ң 1 ө ә .
MPI_CommGridComm;
intsize,rank,i;
intix,iy,iz;
intx,y,z,X=10,Y=10,Z=10;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Status status;
y=Y/size+2;
|
|
double matrix[X][y][Z],vecUP[X][Z],vecDOWN[X][Z];
if(rank==0)
{
for(ix=1;ix<X-1;ix++)
{
for(iz=1;iz<Z-1;iz++)
{
matrix[ix][1][iz]=1;
}
}
for(ix=1;ix<X-1;ix++)
{
for(iy=2;iy<y-1;iy++)
{
for(iz=1;iz<Z-1;iz++)
{
matrix[ix][iy][iz]=0;
}
}
}
}else
{
for(ix=1;ix<X-1;ix++)
{
for(iy=1;iy<y-1;iy++)
{
for(iz=1;iz<Z-1;iz++)
{
matrix[ix][iy][iz]=0;
}
}
}
}
for(inti=0;i<10;i++)
{
if(rank<size-1)
{
for(ix=0;ix<X;ix++)
{
for(iz=0;iz<Z;iz++)
{
vecUP[ix][iz]=matrix[ix][y-2][iz];
}
}
MPI_Send(vecUP,X*Z,MPI_FLOAT,rank+1,rank,MPI_COMM_WORLD);
MPI_Recv(vecUP,X*Z,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status);
for(ix=0;ix<X;ix++)
{
for(iz=0;iz<Z;iz++)
{
matrix[ix][y-1][iz]=vecUP[ix][iz];
}
}
}
if(rank>0)
{
MPI_Recv(vecDOWN,X*Z,MPI_FLOAT,rank-1,rank-1,MPI_COMM_WORLD,&status);
for(ix=0;ix<X;ix++)
{
for(iz=0;iz<Z;iz++)
{
matrix0[ix][0][iz]=vecDOWN[ix][iz];
vecDOWN[ix][iz]=matrix[ix][1][iz];
}
}
MPI_Send(vecDOWN,X*Z,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD);
}
for(iz=1;iz<Z-1;iz++)
{
for(iy=1;iy<y-1;iy++)
{
if(rank==0&&iy==1){continue;}
if(rank==size-1&&iy==y-2){break;}
for(ix=1;ix<X-1;ix++)
{
matrix[ix][iy][iz]=matrix[ix+1][iy][iz]+matrix[ix-1][iy][iz]+matrix[ix][iy+1][iz];
matrix[ix][iy][iz]+=matrix[ix][iy-1][iz]+matrix[ix][iy][iz+1]+matrix[ix][iy][iz-1];
matrix[ix][iy][iz]/=6;
}
}
}
}while(stop==0);
MPI_Finalize();
return 0;
}
1. ә .
. (SISD, SingleInstructionSingleData), . (SIMD, SingleInstructionMultipleData), , .
, , . .
, , , , () . , .
, . , . .
2. . ә . Қ ғ қ . құ ң.
MPI , , , . MPI - , . . , . , MPI, - , , . . . . - - . , . - . . . -:int MPI_Cart_create(MPI_Comm oldcomm, int ndims, int *dims, int *periods, int reorder, MPI_Comm *cartcomm), : oldcomm - . ; ndims - . . , dims - ndims, - . , periods - ndims, , - . ; reorder - . . , cartcomm -. . . . . - , . ; . . . , . . .
|
|
3.2 ө ң 1-ө ә .
constint N=100;
float P[N][N],
h=0.01, //
eps=0.01, //
max, //
**p, //
**pp, //
a[N],b[N]; //
inti,j,
c, //-
stop = 1; //
intrank,size;
MPI_Init(&argc,&argv);
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(rank<N%size)
{
c=N/size+1;
}else
{
c=N/size;
}
p=newfloat*[c];
pp=newfloat*[c];
for(i=0;i<c;i++)
{
p[i]=newfloat[N];
pp[i]=newfloat[N];
p[i][0]=1;
pp[i][0]=1;
for(int j=1;j<N;j++)
{
p[i][j]=0;
pp[i][j]=0;
}
}
if(rank==0)
{
do
{
if(size>1)
{
MPI_Send(&p[c-1][0],N,MPI_FLOAT,rank+1,
0,MPI_COMM_WORLD);
MPI_Recv(a,N,MPI_FLOAT,rank+1,size,
MPI_COMM_WORLD, &status);
}
max=0.0;
for(i=1;i<c-1;i++)
{
for(j=1;j<N-1;j++)
{
p[i][j]=(pp[i+1][j]+pp[i-1][j]+pp[i][j+1]+pp[i][j-1])/4;
if(max<fabs(p[i][j]-pp[i][j]))
{
max=fabs(p[i][j]-pp[i][j]);
}
}
}
if(size>1)
{
for(j=1;j<N-1;j++)
{
p[c-1][j]=(pp[c-2][j]+a[j]+pp[c-1][j+1]+pp[c-1][j-1])/4;
if(max<fabs(p[c-1][j]-pp[c-1][j]))
{
max=fabs(p[c-1][j]-pp[c-1][j]);
}
}
floatmaxx;
for(i=1;i<size;i++)
{
MPI_Recv(&maxx,1,MPI_FLOAT,i,2*size,MPI_COMM_WORLD,&status);
if(maxx>max)
{
max=maxx;
}
}
}
if(max<=eps)
{
stop=0;
}
if(size>1)
{
for(i=1;i<size;i++)
{
MPI_Send(&stop,1,MPI_INT,i,3*size,MPI_COMM_WORLD);
}
}
for(i=0;i<c;i++)
{
for(j=0;j<N;j++)
{
pp[i][j]=p[i][j];
}
}
}while(stop==1);
for(i=0;i<c;i++)
{
for(int j=0;j<N;j++)
{
P[i][j]=p[i][j];
}
}
if(size>1)
{
intjj=c-1;
for(i=1;i<size;i++)
{
MPI_Recv(&c,1,MPI_INT,i,4*size,MPI_COMM_WORLD,&status);
for(j=0;j<c;j++)
{
jj++;
MPI_Recv(&P[jj][0],100,MPI_FLOAT,i,5*size,MPI_COMM_WORLD,&status);
}
}
}
ofstream out("result.txt");
for(i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
out<<P[i][j]<<'\t'; //
}
out<<'\n';
}
}
if(rank==size-1&&size>1)
{
do
{
MPI_Recv(b,N,MPI_FLOAT,rank-1,0,MPI_COMM_WORLD,&status);
MPI_Send(&p[0][0],N,MPI_FLOAT,rank-1,size,MPI_COMM_WORLD);
max=0;
for(i=1;i<c-1;i++)
{
for(j=1;j<N-1;j++)
{
p[i][j]=(pp[i+1][j]+pp[i-1][j]+pp[i][j+1]+pp[i][j-1])/4;
if(max<fabs(pp[i][j]-p[i][j]))
{
max=fabs(pp[i][j]-p[i][j]);
}
}
}
for(j=1;j<N-1;j++)
{
p[0][j]=(pp[1][j]+b[j]+pp[0][j+1]+pp[0][j-1])/4;
if(max<fabs(pp[0][j]-p[0][j]))
{
max=fabs(pp[0][j]-p[0][j]);
}
}
MPI_Send(&max,1,MPI_FLOAT,0,2*size,MPI_COMM_WORLD);
for(i=0;i<c;i++)
{
for(j=0;j<N;j++)
{
pp[i][j]=p[i][j];
}
}
MPI_Recv(&stop,1,MPI_INT,0,3*size,MPI_COMM_WORLD,&status);
}while(stop==1);
|
|
MPI_Send(&c,1,MPI_INT,0,4*size,MPI_COMM_WORLD);
for(i=0;i<c;i++)
{
MPI_Send(&p[i][0],N,MPI_FLOAT,0,5*size,MPI_COMM_WORLD);
}
}
if(rank>0&&rank<size-1)
{
do
{
MPI_Recv(b,N,MPI_FLOAT,rank-1,0,MPI_COMM_WORLD,&status);
MPI_Send(&p[c-1][0],N,MPI_FLOAT,rank+1,0,MPI_COMM_WORLD);
MPI_Recv(a,N,MPI_FLOAT,rank+1,size,MPI_COMM_WORLD,&status);
MPI_Send(&p[0][0],N,MPI_FLOAT,rank-1,size,MPI_COMM_WORLD);
max=0;
int ii;
if(rank<N%size||100%size==0)
{
ii=rank*c;
}
if(rank>N%size&&100%size!=0)
{
ii=(N%size)*(c+1)+(rank-N%size)*c;
}
for(i=1;i<c-1;i++)
{
for(j=1;j<N-1;j++)
{
p[i][j]=(pp[i+1][j]+pp[i-1][j]+pp[i][j+1]+pp[i][j-1])/4;
if(max<fabs(pp[i][j]-p[i][j]))
{
max=fabs(pp[i][j]-p[i][j]);
}
}
}
for(j=1;j<N-1;j++)
{
p[0][j]=(pp[1][j]+b[j]+pp[0][j+1]+pp[0][j-1])/4;
if(max<fabs(pp[0][j]-p[0][j]))
{
max=fabs(pp[0][j]-p[0][j]);
}
p[c-1][j]=(pp[c-2][j]+a[j]+pp[c-1][j+1]+pp[c-1][j-1])/4;
if(max<fabs(pp[c-1][j]-p[c-1][j]))
{
max=fabs(pp[c-1][j]-p[c-1][j]);
}
}
MPI_Send(&max,1,MPI_FLOAT,0,2*size,MPI_COMM_WORLD);
for(i=0;i<c;i++)
{
for(j=0;j<N;j++)
{
pp[i][j]=p[i][j];
}
}
MPI_Recv(&stop,1,MPI_INT,0,3*size,MPI_COMM_WORLD,&status);
}while(stop==1);
MPI_Send(&c,1,MPI_INT,0,4*size,MPI_COMM_WORLD);
for(i=0;i<c;i++)
{
MPI_Send(&p[i][0],N,MPI_FLOAT,0,5*size,MPI_COMM_WORLD);
}
}
1. ә қ ә. .
. (.. , , , ..). (.. , , , ..). : (trival), (functional) . . , , .
, , . -. , , .