MPI_Irecv 中的致命错误:正在中止作业

Posted

技术标签:

【中文标题】MPI_Irecv 中的致命错误:正在中止作业【英文标题】:Fatal Error in MPI_Irecv: Aborting Job 【发布时间】:2011-09-07 10:36:44 【问题描述】:

当我尝试在四个处理器上运行问题时收到以下错误序列。我使用的 MPI 命令是 mpirun -np 4

对于按原样发布错误消息深表歉意(主要是由于缺乏解密所提供信息的知识)。非常感谢您对以下方面的意见:

    错误消息是什么意思?在什么时候收到它?是因为系统内存(硬件)还是由于通信错误(与 MPI_Isend/Irecv 相关的东西?即软件问题)。

    最后,我该如何解决这个问题?

谢谢!

收到的错误消息如下:- - *请注意:仅当时间过长时才会收到此错误*。 当计算数据所需的时间很短(即 300 个时间步与 1000 个时间步相比)时,代码计算良好

中止工作:

MPI_Irecv 中的致命错误:其他 MPI 错误,错误堆栈:

MPI_Irecv(143): MPI_Irecv(buf=0x8294a60, count=48, MPI_DOUBLE, src=2, tag=-1, MPI_COMM_WORLD, request=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, request=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, count=48, MPI_DOUBLE, src=2, tag=-1, MPI_COMM_WORLD, request=0xffffd678) 失败

MPID_Irecv(64):内存不足

作业 1 中的 3 级 myocyte80_37021 导致所有等级的集体中止 rank 3的退出状态:返回码13

工作 1 中的排名 1 myocyte80_37021 导致所有级别的集体中止 rank 1的退出状态:返回码13

编辑: (源代码

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

【问题讨论】:

“内存不足”对我来说似乎很清楚。你到底在问什么? 没有人能准确地告诉您为什么仅凭此信息就会收到此错误。应该澄清这个问题,以更好地描述问题,也许用代码 sn-p。因为它可能会因为不是一个真正的问题而被关闭。 这是在集群还是单机上运行? 您是否计算过您的问题需要多少内存,或者只是使用top 监控它?就像@ildjam 所说,内存不足是很清楚的。尤其是当你说它发生在更大的问题规模时,你可能在每个时间步都出现内存泄漏,这种情况只会复合,直到你用完为止。 Adam:这是在集群上运行的。我使用以下命令提交作业:mpirun -np 4 。我假设它在 4 个节点上运行。在我们的设置中,每个节点都有 4 个处理器。但是,当我使用“top”时,我注意到 4 个处理器中的每一个都以 99% 的效率运行。问题如下: 1. 内存泄漏是什么意思?如果它是内存问题(即由于内存不足而基于硬件),我该如何解决这个问题?基本上,我可以通过某种方式设置 MPI 来解决这个问题吗? 2.我提交MPI RUN的方式,如何提交让每个节点只计算1个线程? 【参考方案1】:

您是否反复调用 MPI_Irecv?如果是这样,您可能没有意识到每个调用都会分配一个请求句柄 - 当接收到消息并使用(例如)MPI_Test 测试完成时,这些句柄会被释放。过度使用 MPI_Irecv 或 MPI 实现为此目的分配的内存可能会耗尽内存。

只有看到代码才能确认问题。

【讨论】:

【参考方案2】:

现在代码已添加到问题中:这确实是脏代码。您只需等待来自Irecvcall 的请求。是的,如果收到消息,您就知道发送已完成,因此您不必等待。但是跳过等待会导致内存泄漏:Isend 分配一个新请求,Wait 将取消分配。由于您从不等待,因此您不会释放内存泄漏。

【讨论】:

以上是关于MPI_Irecv 中的致命错误:正在中止作业的主要内容,如果未能解决你的问题,请参考以下文章

information_schema 查询期间 MySQL 致命错误(软件导致连接中止)

iOS Swift 3核心数据-尝试递归调用-save的致命错误:上下文中止

错误处理

PhpUnit 未显示 php 致命错误的堆栈跟踪

PhpUnit 未显示 php 致命错误的堆栈跟踪

Py4JJavaError:调用 o57.sql 时发生错误。:org.apache.spark.SparkException:作业中止