.


:




:

































 

 

 

 


. ISD, IMD




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. ү. . .

, , , ( ) . .

, (, , ). , , . , , . , .





:


: 2016-07-29; !; : 582 |


:

:

: , .
==> ...

1632 - | 1596 -


© 2015-2024 lektsii.org - -

: 0.016 .