私は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)
このエラーは、プロセス で最初に報告されたもので、他のプロセスでも発生している可能性があります。 "mpirunは指定された実行可能ファイルを見つけることができませんでした。 – shekhar
私はmpiを使用しませんが、[このページ](https://linux.die.net/man/1/mpirun)を見てみると、 '-n'引数がないことを示唆しています。 –
...しかし、[このページ](https://www.open-mpi.org/doc/v2.0/man1/mpirun.1.php)にあります。 –