我有两个略有不同但得到相同结果的 MPI 代码。
第一个来自一个开源包,其中包含几个数据交换步骤:
int main ( int argc, char **argv )
{
int i,j,nx=600,nz=300,NP, MYID;
int idum[2];
float v[420][720];
for (i=0;i<420;i++){
for (j=0;j<720;j++){
if(i<161) { v[i][j] = 2800.0; }
else { v[i][j] = 5200.0; }
}
}
MPI_Init ( &argc, &argv );
MPI_Comm_size ( MPI_COMM_WORLD, &NP );
MPI_Comm_rank ( MPI_COMM_WORLD, &MYID );
if(MYID==0){
idum[0] = nx;
idum[1] = nz;
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(&idum,5,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(&v,420*720,MPI_FLOAT,0,MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
nx = idum[0];
nz = idum[1];
for (i=0;i<5;i++){
printf("id=%d,v[%d][350]=%f,\n",MYID,i*100+19,v[i*100+19][350]);
}
printf("nx=%d,nz=%d\n",nx,nz);
MPI_Finalize();
exit(0);
}
我使用内核运行mpirun代码4。结果是:
id=0,v[19][350]=2800.000000,
id=0,v[119][350]=2800.000000,
id=0,v[219][350]=5200.000000,
id=0,v[319][350]=5200.000000,
id=0,v[419][350]=5200.000000,
nx=600,nz=300
id=0,v[19][350]=2800.000000,
id=0,v[119][350]=2800.000000,
id=0,v[219][350]=5200.000000,
id=0,v[319][350]=5200.000000,
id=0,v[419][350]=5200.000000,
nx=600,nz=300
id=0,v[19][350]=2800.000000,
id=0,v[119][350]=2800.000000,
id=0,v[219][350]=5200.000000,
id=0,v[319][350]=5200.000000,
id=0,v[419][350]=5200.000000,
nx=600,nz=300
id=0,v[19][350]=2800.000000,
id=0,v[119][350]=2800.000000,
id=0,v[219][350]=5200.000000,
id=0,v[319][350]=5200.000000,
id=0,v[419][350]=5200.000000,
nx=600,nz=300
但是我觉得数据交换部分有点“冗余?”,所以我把上面的代码简化为:
int main ( int argc, char **argv )
{
int i,j,nx=600, nz=300, NP=0, MYID;
float v[420][720];
for (i=0;i<420;i++){
for (j=0;j<720;j++){
if(i<161) { v[i][j] = 2800.0; }
else { v[i][j] = 5200.0; }
}
}
MPI_Init ( &argc, &argv );
MPI_Comm_size ( MPI_COMM_WORLD, &NP );
MPI_Comm_rank ( MPI_COMM_WORLD, &MYID );
for (i=0;i<5;i++){
printf("id=%d,v[%d][350]=%f,\n",MYID,i*100+19,v[i*100+19][350]);
}
printf("nx=%d,nz=%d\n",nx,nz);
MPI_Finalize();
exit(0);
}
我得到与第一个代码相同的结果。
这两个代码哪一个是正确的?如果两者都正确,哪个更好?为什么我们需要在第一个代码中包含数据交换行,或者不必?
![每个程序员都应该知道的延迟数字]](https://i.stack.imgur.com/ILW2S.png)


