MPI错误:无输出

时间:2011-05-12 18:29:37

标签: mpi runtime-error

以下代码用于使用4个节点使用MPI进行通信。我可以使用“mpiicpc”在集群上成功编译它。

但是,输出屏幕只是给我一个警告,'警告:无法读取mpd.hosts以获取主机列表仅在当前启动并挂起。

您能否提出警告的含义以及我的代码挂起的原因?


#include <mpi.h>
#include <fstream> 

using namespace std;

#define Cols 96 
#define Rows 96 

#define beats 1

ofstream fout("Vm0"); 
ofstream f1out("Vm1"); 
.....
..... 

double V[Cols][Rows];

int r,i,y,ibeat;

int my_rank;
int p;
int source; 
int dest;
int tag = 0;

//Allocating Memory
double *A = new double[Rows*sizeof(double)];
double *B = new double[Rows*sizeof(double)];
.....
......

void prttofile ();

// MAIN FUNCTION 

int main (int argc, char *argv[])
{
//MPI Commands
MPI_Status status;
MPI_Request send_request, recv_request;
MPI_Init (&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);

for (ibeat=0;ibeat<beats;ibeat++)
  {
    for (i=0; i<Cols/2; i++)
    {
        for (y=0; y<Rows/2; y++)
        {
            if (my_rank == 0)
                if (i < 48)
                    if (y<48)
                        V[i][y] = 0;

           ....
               .......
                   .....
        }
    }

    //Load the Array with the edge values
    for (r=0; r<Rows/2; y++)
    {
        if ((my_rank == 0) || (my_rank == 1))
        {
            A[r] = V[r][48];
            BB[r] = V[r][48];
        }

        .....
        .....

    }

   int test = 2;
   if ((my_rank%test) == 0)
   {
   MPI_Isend(C, Rows, MPI_DOUBLE, my_rank+1, 0, MPI_COMM_WORLD, &send_request); 
   MPI_Irecv(CC, Rows, MPI_DOUBLE, my_rank+1, MPI_ANY_TAG, MPI_COMM_WORLD, &recv_request);   
   }

   else if ((my_rank%test) == 1)
   ......
   ......  

    ibeat = ibeat+1;
    prttofile ();
   } //close ibeat

   MPI_Finalize ();

   } //close main

//Print to File Function to save output values
void prttofile ()
 {
    for (i = 0; i<Cols/2; i++)
      {
      for (y = 0; y<Rows/2; y++)
       {
        if (my_rank == 0)
            fout << V[i][y] << " " ;

        ....
            .....
       }
      }

      if (my_rank == 0)
      fout << endl;

      if ....
       ....
 }

1 个答案:

答案 0 :(得分:1)

如果要在多个节点上运行,则必须使用mpirun开关告诉-machinefile您需要哪些节点。这个机器文件只是一个节点列表,每行一个。如果要在一个节点上放置2个进程,请将其列出两次。

因此,如果您的计算机名为node1node2,并且您希望使用两个核心:

$ cat nodes
node1
node1
node2
node2
$ mpirun -machinefile nodes -np 4 ./a.out

如果您正在使用PBS或TORQUE等批量控制系统(使用qsub提交作业),则会为您创建此节点文件,其位置位于$PBS_NODEFILE环境变量中:

mpirun -machinefile $PBS_NODEFILE -np 4 ./a.out