Неустранимая ошибка в MPI_Irecv: прерывание задания - PullRequest
1 голос
/ 03 июня 2011

Следующая последовательность ошибок получена, когда я пытаюсь запустить проблему на четырех процессорах. Используемая мной команда MPI: mpirun -np 4

Прошу прощения за публикацию сообщения об ошибке как есть (в первую очередь из-за недостатка знаний по расшифровке предоставленной информации). Буду признателен за ваш вклад в следующих вопросах:

  1. Что означает сообщение об ошибке? В какой момент его получают? Это из-за системной памяти (аппаратного обеспечения) или из-за ошибки связи (что-то связано с MPI_Isend / Irecv ?, т.е. проблема с программным обеспечением).

  2. Наконец, как мне это исправить?

Спасибо!

Полученное сообщение об ошибке следует ниже: - - * ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: эта ошибка получена только при большом времени *. Код вычисляется нормально, когда время, необходимое для вычисления данных, мало (т. Е. 300 временных шагов по сравнению с 1000 временных шагов)

прерывание работы:

Фатальная ошибка в MPI_Irecv: Другая ошибка MPI, стек ошибок:

MPI_Irecv (143): сбой MPI_Irecv (buf = 0x8294a60, число = 48, MPI_DOUBLE, src = 2, тег = -1, MPI_COMM_WORLD, запрос = 0xffffd68c)

MPID_Irecv (64): недостаточно памяти

прерывание работы:

Фатальная ошибка в MPI_Irecv: Другая ошибка MPI, стек ошибок:

MPI_Irecv (143): сбой MPI_Irecv (buf = 0x8295080, count = 48, MPI_DOUBLE, src = 3, tag = -1, MPI_COMM_WORLD, запрос = 0xffffd690)

MPID_Irecv (64): недостаточно памяти

прерывание работы: Неустранимая ошибка в MPI_Isend: Внутренняя ошибка MPI !, стек ошибок:

MPI_Isend (142): сбой MPI_Isend (buf = 0x8295208, count = 48, MPI_DOUBLE, dest = 3, tag = 0, MPI_COMM_WORLD, request = 0xffffd678)

(неизвестно) (): внутренняя ошибка MPI!

прерывание работы: Неустранимая ошибка в MPI_Irecv: Другая ошибка MPI, стек ошибок:

MPI_Irecv (143): сбой MPI_Irecv (buf = 0x82959b0, число = 48, MPI_DOUBLE, src = 2, тег = -1, MPI_COMM_WORLD, запрос = 0xffffd678)

MPID_Irecv (64): недостаточно памяти

ранг 3 в задании 1 myocyte80_37021 вызвал коллективный прерывание всех рангов статус выхода ранга 3: код возврата 13

ранг 1 в задании 1 myocyte80_37021 вызвал коллективный прерывание всех рангов статус выхода ранга 1: код возврата 13

EDIT : ( ИСТОЧНИК КОД )

Header files
Variable declaration
TOTAL TIME = 
...
...
double *A = new double[Rows];
double *AA = new double[Rows];
double *B = new double[Rows;
double *BB = new double[Rows];
....
....
int Rmpi;
int my_rank;
int p;
int source; 
int dest;
int tag = 0;
function declaration

int main (int argc, char *argv[])
{
MPI_Status status[8]; 
MPI_Request request[8];
MPI_Init (&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &p);   
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

//PROBLEM SPECIFIC PROPERTIES. VARY BASED ON NODE 
if (Flag = 1)
{
if (my_rank == 0)
{
Defining boundary (start/stop) for special elements in tissue (Rows x Column)
}
if (my_rank == 2)
..
if (my_rank == 3)
..
if (my_rank == 4)
..
}

//INITIAL CONDITIONS ALSO VARY BASED ON NODE
for (Columns = 0; Columns<48; i++) // Normal Direction
{
for (Rows = 0; Rows<48; y++)  //Transverse Direction
{
if (Flag =1 )
{
if (my_rank == 0)
{
Initial conditions for elements
}
if (my_rank == 1) //MPI
{
}
..
..
..
//SIMULATION START

while(t[0][0] < TOTAL TIME)
{       
for (Columns=0; Columns ++) //Normal Direction
{
for (Rows=0; Rows++) //Transverse Direction
{
//SOME MORE PROPERTIES BASED ON NODE
if (my_rank == 0)
{
if (FLAG = 1)
{
Condition 1
}   
 else
{
Condition 2 
}
}

if (my_rank = 1)
....
 ....
  ...

//Evaluate functions (differential equations)
Function 1 ();
Function 2 ();
...
...

//Based on output of differential equations, different nodes estimate variable values. Since   
 the problem is of nearest neighbor, corners and edges have different neighbors/ boundary   
 conditions
if (my_rank == 0)
{
If (Row/Column at bottom_left)                  
{
Variables =
}

if (Row/Column at Bottom Right) 
{
Variables =
}
}
...
 ...

 //Keeping track of time for each element in Row and Column. Time is updated for a certain  
 element. 
 t[Column][Row] = t[Column][Row]+dt;

  }
  }//END OF ROWS AND COLUMNS

 // MPI IMPLEMENTATION. AT END OF EVERY TIME STEP, Nodes communicate with nearest neighbor
 //First step is to populate arrays with values estimated above
 for (Columns, ++) 
 {
 for (Rows, ++) 
 {
 if (my_rank == 0)
 {
 //Loading the Edges of the (Row x Column) to variables. This One dimensional Array data 
 is shared with its nearest neighbor for computation at next time step.

 if (Column == 47)
 {
 A[i] = V[Column][Row]; 
 …
 }
 if (Row == 47)
 {
 B[i] = V[Column][Row]; 
 }
 }

...
...                 

 //NON BLOCKING MPI SEND RECV TO SHARE DATA WITH NEAREST NEIGHBOR

 if ((my_rank) == 0)
 {
 MPI_Isend(A, Rows, MPI_DOUBLE, my_rank+1, 0, MPI_COMM_WORLD, &request[1]);
 MPI_Irecv(AA, Rows, MPI_DOUBLE, my_rank+1, MPI_ANY_TAG, MPI_COMM_WORLD, &request[3]);
 MPI_Wait(&request[3], &status[3]);  
 MPI_Isend(B, Rows, MPI_DOUBLE, my_rank+2, 0, MPI_COMM_WORLD, &request[5]);
 MPI_Irecv(BB, Rows, MPI_DOUBLE, my_rank+2, MPI_ANY_TAG, MPI_COMM_WORLD, &request[7]);
 MPI_Wait(&request[7], &status[7]);
 }

if ((my_rank) == 1)
{
MPI_Irecv(CC, Rows, MPI_DOUBLE, my_rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, &request[1]);
MPI_Wait(&request[1], &status[1]); 
MPI_Isend(Cmpi, Rows, MPI_DOUBLE, my_rank-1, 0, MPI_COMM_WORLD, &request[3]);

MPI_Isend(D, Rows, MPI_DOUBLE, my_rank+2, 0, MPI_COMM_WORLD, &request[6]); 
MPI_Irecv(DD, Rows, MPI_DOUBLE, my_rank+2, MPI_ANY_TAG, MPI_COMM_WORLD, &request[8]);
MPI_Wait(&request[8], &status[8]);
}

if ((my_rank) == 2)
{
MPI_Isend(E, Rows, MPI_DOUBLE, my_rank+1, 0, MPI_COMM_WORLD, &request[2]);
MPI_Irecv(EE, Rows, MPI_DOUBLE, my_rank+1, MPI_ANY_TAG, MPI_COMM_WORLD, &request[4]);
MPI_Wait(&request[4], &status[4]);

MPI_Irecv(FF, Rows, MPI_DOUBLE, my_rank-2, MPI_ANY_TAG, MPI_COMM_WORLD, &request[5]);
MPI_Wait(&request[5], &status[5]);
MPI_Isend(Fmpi, Rows, MPI_DOUBLE, my_rank-2, 0, MPI_COMM_WORLD, &request[7]);
}

if ((my_rank) == 3)
{
MPI_Irecv(GG, Rows, MPI_DOUBLE, my_rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, &request[2]);
MPI_Wait(&request[2], &status[2]);
MPI_Isend(G, Rows, MPI_DOUBLE, my_rank-1, 0, MPI_COMM_WORLD, &request[4]);

MPI_Irecv(HH, Rows, MPI_DOUBLE, my_rank-2, MPI_ANY_TAG, MPI_COMM_WORLD, &request[6]);
MPI_Wait(&request[6], &status[6]); 
MPI_Isend(H, Rows, MPI_DOUBLE, my_rank-2, 0, MPI_COMM_WORLD, &request[8]);
}

 //RELOADING Data (from MPI_IRecv array to array used to compute at next time step)
 for (Columns, ++) 
 {
 for (Rows, ++) 
 {
 if (my_rank == 0)
 {
 if (Column == 47)
 {
 V[Column][Row]= A[i];
 }
 if (Row == 47)
 {
 V[Column][Row]=B[i];
 }
  }

  ….
 //PRINT TO OUTPUT FILE AT CERTAIN POINT
 printval = 100; 
 if ((printdata>=printval))
 {
 prttofile ();
 printdata = 0;
 }
 printdata = printdata+1;
 compute_dt (); 

 }//CLOSE ALL TIME STEPS

 MPI_Finalize ();

  }//CLOSE MAIN

1 Ответ

4 голосов
/ 03 июня 2011

Вы постоянно звоните MPI_Irecv? Если это так, вы можете не понимать, что каждый вызов выделяет дескриптор запроса - и они освобождаются, когда сообщение получено и проверено на завершение с (например,) MPI_Test. Возможно, вы могли бы исчерпать память из-за чрезмерного использования MPI_Irecv - или памяти, назначенной реализацией MPI для этой цели.

Только просмотр кода подтвердит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...