Ошибки при компиляции MPI - PullRequest
0 голосов
/ 11 мая 2011

Я пытаюсь скомпилировать код в C ++, используя код из: https://stackoverflow.com/questions/5953979/sending-and-receiving-array-using-mpi-part-2.

Я использую следующую команду для компиляции: mpiicpc -o <filename> xxxx.cc -lmpi

После компиляции всемои ошибки, кажется, относятся к двум функциям, которые я определил в своем исходном коде для печати выходных значений и выполнения MPI Isend и MPI Irecv.В частности, я получаю два типа ошибок

  1. Ошибка: идентификатор «переменная» не определен
  2. Ошибка: слишком мало аргументов в вызове функции: MPI_Isend/MPI_Irecv и MPI Waitall(); Наконец, этосуществует с этим сообщением: компиляция прервана для xxxx.cc (код 2).

Не могли бы вы указать, что я должен делать неправильно при определении переменных?

Вот выдержка из моего исходного кода (код в полном объеме доступен на https://stackoverflow.com/questions/5953979/sending-and-receiving-array-using-mpi-part-2):

int main (int argc, char *argv[])
{
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)];
....
....
....

//MPI Commands
MPI_Status status;
MPI_Init (&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);

//For number of beats

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;

            if (my_rank ==
              .....
                ....
                  ....        
        }
    }

    //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];
        }

        if ((my_rank
            ...
            ...
    }

    prttofile ();
    outputpass ();
    ibeat = ibeat+1;
 }

 MPI_Finalize ();
}


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;
 ....
}


void outputpass ()
{
int test = 2;
if ((my_rank%test) == 0)
{
    MPI_Isend(C, Rows, MPI_DOUBLE, my_rank+1, MPI_COMM_WORLD); //Non blocking Send
    MPI_Irecv(CC, Rows, MPI_DOUBLE, my_rank+1, MPI_COMM_WORLD, &status); //Non Blocking Recv
}
else if ((my_rank%test) == 1)
....
....

MPI_Waitall ();
}

Ответы [ 2 ]

2 голосов
/ 11 мая 2011
  1. Вы не объявляете много переменных - в частности, счетчиков циклов. Объявите их все в начале ваших функций, и все будет в порядке.

  2. Согласно документации подпись MPI_Isend():

    int MPI_Isend( void *buf, int count, MPI_Datatype datatype, int dest,
           int tag, MPI_Comm comm, MPI_Request *request ) 
    

    У него семь параметров - вы передаете только пять аргументов. Вам нужно будет это исправить. То же самое касается MPI_Irecv().

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

MPI_Isend() требует гораздо больше аргументов, чем вы указали. Вот ваша строка:

MPI_Isend(C, Rows, MPI_DOUBLE, my_rank+1, MPI_COMM_WORLD);

Где тег? Где запрос?

Аналогично, у вашего MPI_Waitall() нет никаких аргументов вообще! Вам нужен массив запросов, количество запросов и массив статусов.

Предлагаю вам прочитать пример неблокирующей связи в MPI.

...