Ошибка MPI: нет выхода - PullRequest
1 голос
/ 12 мая 2011

Код ниже предназначен для использования 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 Ответ

1 голос
/ 18 мая 2011

Если вы хотите работать на нескольких узлах, вы должны указать mpirun, какие из них вам нужны, с помощью переключателя -machinefile.Этот машинный файл - это просто список узлов, по одному на строку.Если вы хотите разместить 2 процесса на одном узле, перечислите его дважды.

Так что если ваши машины имеют имена node1 и node2 и вы хотите использовать два ядра из каждого:

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