【发布时间】:2011-09-09 14:46:15
【问题描述】:
我正在尝试解决 Fatal Error in MPI_Irecv: Aborting Job 并收到对该查询的混合(有用,但不完整)响应。
错误信息如下:
aborting job:
> Fatal error in MPI_Irecv: Other MPI
> error, error stack: MPI_Irecv(143):
> MPI_Irecv(buf=0x8294a60, count=48,
> MPI_DOUBLE, src=2, tag=-1,
> MPI_COMM_WORLD, request=0xffffd6ac)
> failed MPID_Irecv(64): Out of
> memory
我正在寻求某人的帮助来回答这些问题(我需要指导来帮助调试和解决这个死锁)
-
在“MPI Non Blocking Send and Receive”结束时,内存是在发送/接收完成后自行释放还是必须强制释放?
-
如果我使用“多核”而不是单核,“内存不足”的问题会得到解决吗?我们目前有 4 个处理器到 1 个内核,我使用以下命令提交我的工作:
mpirun -np 4 <file>。我尝试使用mpirun n -4 <file>,但它仍然在同一个内核上运行 4 个线程。 -
如何确定我的程序需要多少“共享内存”?
MPI_ISend/MPI_IRecv 在我的代码中的递归循环内,因此不太清楚错误的来源是否在那里(如果我只使用一次或两次发送/接收命令,系统计算就好了没有“内存不足问题”)。如果是这样,如何检查和缓解这些信息?
#include <mpi.h>
#define Rows 48
double *A = new double[Rows];
double *AA = new double[Rows];
....
....
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);
while (time < final_time){
...
...
for (i=0; i<Columns; i++)
{
for (y=0; y<Rows; y++)
{
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]);
}
}
}
}
谢谢!
【问题讨论】:
-
使用多核而不是单核并不能解决内存不足的问题,它仍然是您计算机中的同一块内存,无论使用一核还是四核!
-
@Gajet:这是在集群上运行的......所以我想,每个核心都有自己的共享内存。因此,我假设内存问题也许可以解决!?但是,我不确定,因此这个想法。
-
1.阅读代码不是问题。调试它。 2. 如果错误消息比“内存不足”或“其他 MPI 错误”更具体,那么该假设可能成立;在这种情况下,信息越多越好。 3. 编辑这篇文章,例如对于那些对调试感兴趣的人来说,一个保管箱链接会很有用;另一个新线程绝对没有保证。
标签: c++ multicore mpi parallel-processing shared-memory