2017-08-04 18 views
0

私はMPIプログラミングの初心者です。 Anew [i] [j] = Aold [i] [j] + Aold [i] [j + 1]を使って古い行列から新しい行列を形成するコードを実行しようとしています。これは10回。私は、次のコードを記述します。mpiプログラムはコンパイルされていますが、実行されません

#include"mpi.h" 
#include<stdio.h> 
#include <stdlib.h> 


int main(int argc, char *argv[]) 

{ 
void calculate(); 
int taskid,numtasks,numworkers,rowmean,offset,t, 
BEGIN=1, 
msgtype, 
start, 
RTAG=3, 
LTAG=2, 
NX=20, 
NY=20, 
MASTER=0, 
NONE=0, 
DONE=4, 
TIMESTEP=10, 
source, 
ext, 
end, 
left, 
rows, 
right, 
dest; 
MPI_Status status; 
float u[2][NX][NY]; 

MPI_Init(&argc,&argv); 
MPI_Comm_rank(MPI_COMM_WORLD,&taskid); 
MPI_Comm_size(MPI_COMM_WORLD,&numtasks); 
numworkers=numtasks-1; 

rowmean=NX/numworkers; 
ext=NX%numworkers; 

if (taskid==MASTER) 
{ 
    offset=0; 
    for (int i=1;i<=numworkers;i++) 
    { 
     if (i==1) 
     { 
      left=NONE; 
     } 
     else 
     { 
      left=i-1; 
     } 
     if (i==numworkers) 
     { 
      right=NONE; 
     } 
     else 
     { 
      right=i+1; 
     } 
     dest=i; 
     rows=(i<=ext) ? rowmean+1:rowmean; 
     MPI_Send(&u[0][offset][0],rows*NY,MPI_FLOAT,dest,BEGIN,MPI_COMM_WORLD); 
     MPI_Send(&offset,1,MPI_INT,dest,BEGIN,MPI_COMM_WORLD); 
     MPI_Send(&rows,1,MPI_INT,dest,BEGIN,MPI_COMM_WORLD); 
     MPI_Send(&right,1,MPI_INT,dest,BEGIN,MPI_COMM_WORLD); 
     MPI_Send(&left,1,MPI_INT,dest,BEGIN,MPI_COMM_WORLD); 
     offset=offset+rows; 
    } 
    for(int i=1;i<=numworkers;i++) 
    { 
     source=i; 
     msgtype=DONE; 
     MPI_Recv(&u[1][offset][0],rows*NY,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
     MPI_Recv(&offset,1,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
     MPI_Recv(&rows,1,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
    } 
    MPI_Finalize(); 
    /*end of master code*/ 
} 

/************************************従業員コード************************************************ **************/

if (taskid!=MASTER) 
{ 
    /* initialization*/ 
    for (int i=0;i<2;i++) 
    { 
     for (int j=0;j<NX;j++) 
     { 
      for(int k=0;k<NY;k++) 
      { 
       u[i][j][k]=i+j+k; 
       //cout<<u[i][j][k]<<" "; 
      } 
      //cout<<"\n"; 
     } 
     //cout<<"\n\n"; 
    } 
    source=MASTER; 
    msgtype=BEGIN; 
    MPI_Recv(&u[0][offset][0],rows*NY,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
    MPI_Recv(&offset,1,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
    MPI_Recv(&rows,1,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
    MPI_Recv(&left,1,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
    MPI_Recv(&right,1,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
    int iz=0; 

    for (int t=1;t<=TIMESTEP;t++) 
    { 
     start=offset; 
     if (offset==0) 
     { 
      start=1; 
     } 
     end=offset+rows-1; 
     if (end==NY-1) 
     { 
      end=NY-2; 
     } 
     if (left!=NONE) 
     { 
      MPI_Send(&u[iz][offset][0],NY,MPI_FLOAT,left,RTAG,MPI_COMM_WORLD); 
      source=left; 
      msgtype=LTAG; 
      MPI_Recv(&u[iz][offset-1][0],NY,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
     } 
     if (right!=NONE) 
     { 
      MPI_Send(&u[iz][offset+rows-1][0],NY,MPI_FLOAT,right,LTAG,MPI_COMM_WORLD); 
      source=right; 
      msgtype=RTAG; 
      MPI_Recv(&u[iz][offset+rows][0],NY,MPI_FLOAT,source,msgtype,MPI_COMM_WORLD,&status); 
     } 
     iz=1-iz; 
     calculate(start,end,NY,&u[iz][offset][0],&u[1-iz][offset][0]); 
    } 
    MPI_Send(&u[iz][offset][0],rows*NY,MPI_FLOAT,MASTER,DONE,MPI_COMM_WORLD); 
    MPI_Send(&offset, 1, MPI_INT, MASTER, DONE, MPI_COMM_WORLD); 
    MPI_Send(&rows, 1, MPI_INT, MASTER, DONE, MPI_COMM_WORLD); 
    MPI_Finalize; 
} 
return 0; 

}

/* calculate function*/ 
void calculate(int start,int end,int NY,float *u1, float *u2) 
{ 
for(int i=start;i<=end;i++) 
{ 
    for (int j=0;j<NY;j++) 
    { 
     *(u2+i*NY+j)=*(u1+i*NY+j)+*(u1+(i+1)*NY+j); 
    } 
} 

}

コードは

012を用いて微細なコンパイル
mpicc mpi_matrix.c 

しかし

mpirun -n 4 mpi_matrix 

を使用して実行されませんが、エラーに

mpirun was unable to find the specified executable file, and therefore 
did not launch the job. This error was first reported for process 
rank 0; it may have occurred for other processes as well. 

を与える誰もが助けることはできますか? ありがとうございました

EDIT 1:何を試した後に@メートルが言った。プログラムはコンパイルされて実行されますが、エラーが発生します。以下のあなたがターゲットファイル名を提供するために、 -o を指定する必要がmpiccのでコンパイルする場合は、エラー

[shekhar-HP-Pavilion-Notebook:3296] *** An error occurred in MPI_Recv 
[shekhar-HP-Pavilion-Notebook:3296] *** reported by process [3817603073,3] 
[shekhar-HP-Pavilion-Notebook:3296] *** on communicator MPI_COMM_WORLD 
[shekhar-HP-Pavilion-Notebook:3296] *** MPI_ERR_TRUNCATE: message truncated 
[shekhar-HP-Pavilion-Notebook:3296] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort, 
[shekhar-HP-Pavilion-Notebook:3296] *** and potentially your MPI job) 
+0

このエラーは、プロセス で最初に報告されたもので、他のプロセスでも発生している可能性があります。 "mpirunは指定された実行可能ファイルを見つけることができませんでした。 – shekhar

+0

私はmpiを使用しませんが、[このページ](https://linux.die.net/man/1/mpirun)を見てみると、 '-n'引数がないことを示唆しています。 –

+0

...しかし、[このページ](https://www.open-mpi.org/doc/v2.0/man1/mpirun.1.php)にあります。 –

答えて

1

です。

代わりにデフォルトでは、この

mpirun -np 4 ./a.out 

のようにそれを起動し、この

mpicc -o mpi_matrix mpi_matrix.c 
mpirun -np 4 ./mpi_matrix 

を試してみてくださいあなたは-oを提供しない場合は、mpiccのは a.outの実行ファイルを作成します。

+0

あなたの問題の解決策としてそれを見つけたら、それを受け入れることができればうれしいでしょう。 MPIで楽しみなさい:) – mko

+0

答えをありがとう。それは完全に良い動作します。しかし、今ではコードに問題があります。エラーを返します。 (編集された質問を参照してください) – shekhar

+0

'' taskid!= MASTER'なら 'rows'は初期化されていないようです –

関連する問題