使用MPI文件写入所有MPI-IO死锁

使用MPI文件写入所有MPI-IO死锁,io,mpi,deadlock,Io,Mpi,Deadlock,在集群上的512进程上运行此简单代码时,我的MPI代码死锁。我远远没有达到记忆的极限。如果我将process的数量增加到2048,这对于这个问题来说太多了,代码会再次运行。死锁发生在包含MPI\u文件\u write\u all的行中 有什么建议吗 int count = imax*jmax*kmax; // CREATE THE SUBARRAY MPI_Datatype subarray; int totsize [3] = {kmax, jtot, itot}; int subsize

在集群上的512进程上运行此简单代码时,我的MPI代码死锁。我远远没有达到记忆的极限。如果我将process的数量增加到2048,这对于这个问题来说太多了,代码会再次运行。死锁发生在包含
MPI\u文件\u write\u all
的行中

有什么建议吗

int count = imax*jmax*kmax;

// CREATE THE SUBARRAY
MPI_Datatype subarray;
int totsize [3] = {kmax, jtot, itot};
int subsize [3] = {kmax, jmax, imax};
int substart[3] = {0, mpicoordy*jmax, mpicoordx*imax};
MPI_Type_create_subarray(3, totsize, subsize, substart, MPI_ORDER_C, MPI_DOUBLE, &subarray);
MPI_Type_commit(&subarray);

// SET THE VALUE OF THE GRID EQUAL TO THE PROCESS ID FOR CHECKING
if(mpiid == 0) std::printf("Setting the value of the array\n");
for(int i=0; i<count; i++)
  u[i] = (double)mpiid;

// WRITE THE FULL GRID USING MPI-IO
if(mpiid == 0) std::printf("Write the full array to disk\n");
char filename[] = "u.dump";
MPI_File fh;
if(MPI_File_open(commxy, filename, MPI_MODE_CREATE | MPI_MODE_WRONLY | MPI_MODE_EXCL, MPI_INFO_NULL, &fh))
  return 1;

// select noncontiguous part of 3d array to store the selected data
MPI_Offset fileoff = 0; // the offset within the file (header size)
char name[] = "native";

if(MPI_File_set_view(fh, fileoff, MPI_DOUBLE, subarray, name, MPI_INFO_NULL))
  return 1;

if(MPI_File_write_all(fh, u, count, MPI_DOUBLE, MPI_STATUS_IGNORE))
  return 1;

if(MPI_File_close(&fh))
  return 1;
int count=imax*jmax*kmax;
//创建子阵列
MPI_数据类型子阵列;
int totsize[3]={kmax,jtot,itot};
int subsize[3]={kmax,jmax,imax};
int substart[3]={0,mpicoordy*jmax,mpicoordx*imax};
MPI类型创建子数组(3、总大小、子数组、子数组、MPI顺序、MPI双数组和子数组);
MPI_类型_提交(&子阵列);
//将网格的值设置为要检查的进程ID
if(mpid==0)std::printf(“设置数组的值\n”);

对于(int i=0;i您的代码在快速检查时看起来是正确的。我建议您让您的MPI-IO库帮助告诉您出了什么问题:与其从错误中返回,不如至少显示错误?以下是一些可能有帮助的代码:


static void handle_error(int errcode, char *str)
{
        char msg[MPI_MAX_ERROR_STRING];
        int resultlen;
        MPI_Error_string(errcode, msg, &resultlen);
        fprintf(stderr, "%s: %s\n", str, msg);
        MPI_Abort(MPI_COMM_WORLD, 1);
}
MPI_成功率保证为0吗?我宁愿看一看

 errcode = MPI_File_routine();
 if (errcode != MPI_SUCCESS) handle_error(errcode, "MPI_File_open(1)");

errcode=MPI_文件_例程();
如果(errcode!=MPI_SUCCESS)处理错误(errcode,“MPI_文件打开(1)”);


如果你正在做一些棘手的事情,比如设置偏移量不是单调非递减的文件视图,错误字符串可能会提示出什么问题。

代码不会返回值,因为它会死锁。我怎么会得到返回错误?我想我不理解你的死锁。每一个mpi进程s卡在MPI例程中?更有可能是一个或两个返回错误,其余的正在等待通讯器中的队列参与例程。我也不理解这个死锁。所有进程都没有返回任何东西。我已经实现了你的建议,但MPI完全挂起了。嗯。那么可以吗e您在mpi实现中看到了一个错误?当您遇到死锁时,您可以将GDB连接到其中一个进程,并查看它试图执行的操作。从秩0、秩N和介于两者之间的一些随机秩进行回溯将很有帮助,如果不是为了stackoverflow,那么就可以向您的mpi供应商报告。我也在那里报告了这个问题,可能您是对的。有趣的事实是,死锁发生在一个系统(SuperMUC、IBM/Intel)上低于最小处理器数(512)而在另一个系统(Juqueen/BG Q)上高于特定进程数(4096)的情况下,这提示我设置。我将与他们联系并在此处报告原因,以便具有相同问题的其他用户获得完整信息。
imax
jmax
kmax
的值是什么?还有
jtot
itot
的值。