1. ? ғ ? ғ ғ.
MPI , , MIMD. , , . MPI. , MPI . , MPI. MPI . . `` '' (`` thread-safe''). MPI , MPI, ; MPI , . MPI . , . ; , ; . , MPI ( ), . , , . . 0,..., groupsize-1.
2. . қ ө қ.
() MPI : int MPI_Cart_create(MPI_Comm oldcomm, int ndims, int *dims, int *periods, int reorder, MPI_Comm *cartcomm). , . , , , . , , , , . periods - ndims, , . int dims[2]={0,0}, periods[2]={1,0},coords[2], ndims=2, reorder=0; - MPI_Cart_create(MPI_COMM_WORLD,ndims,dims,periods,reorder,&cartcomm) . periods[2]={1,1} .
3. 3 ө ң 2-ө ә .
|
|
MPI_Comm GridComm;
int size,rank,i;
int ix,iy,iz;
int x,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(int i=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;
}
. ISD, IMD .
. . :
SISD (Single Instruction Stream - Single Data Stream) ;
SIMD (Single Instruction Stream Multiple Data Stream) ;
MISD (Multiple Instruction Stream Single Data Stream) ;
MIMD (Multiple Instruction Stream Multiple Data Stream)
MISD
. , , . . ,
MIMD
, . , , .. , , .
|
|
2. MPI , ә .
MPI , . mpicc( ), mpic++( ++), mpif77/mpif90( 77/90). -o name name , a.out, : mpif77 o program program.f
. MPI mpirun,mpiexec, :
mpirun np N < >
mpiexec np N < >
N- , . , .
3. 2*sin(x) ң [0,1] қ ң.
double f(double x)
{return 2*sin(x);}
int main(int argc,char **argv)
{
int size,rank;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
float h=0.05,a=0,b=1,s=0.0;
for(int i=rank; a+h*(i+1)<b+h; i+=size)
{ s+=h*f(a+h*(i+1)); }
if(rank!=0)
{ MPI_Send(&s,1,MPI_FLOAT,0,1,MPI_COMM_WORLD); }
if(rank==0)
{ float r;
MPI_Recv(&r,1,MPI_FLOAT,1,1,MPI_COMM_WORLD,&status);
s+=r;
printf("s=%f\n ",s);
}
}
1. ү. . .
, , , ( ) . .
, (, , ). , , . , , . , .