io - 使用 MPI_File_write_all 的 MPI-IO 死锁

标签 io mpi deadlock

当我在集群上的 512 进程上运行这个简单的代码时,我的 MPI 代码出现死锁。我距离内存极限还很远。如果我将进程数增加到2048(对于这个问题来说太多了),代码会再次运行。死锁发生在包含MPI_File_write_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;

最佳答案

快速检查后,您的代码看起来正确。我建议您让 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_SUCCESS 是否保证为 0?我宁愿看到


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

将其放入,如果您正在做一些棘手的事情,例如设置文件 View 的偏移量不是单调非递减的,则错误字符串可能会表明出了什么问题。

关于io - 使用 MPI_File_write_all 的 MPI-IO 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12438727/

相关文章:

c# - 在物理路径中使用 HttpPostedFileBase.SaveAs 保存上传的文件

java - 如何检查文件是否存在于 Java 中?

c++ - 有效地收集/分散任务

c - MPI 中的属性缓存

go - Golang 的 `all goroutines are asleep - deadlock!` 错误背后的算法是什么?

java - StringEncoder 和 StringDecoder 在 netty 服务器中的正确用法是什么?

java - 使用 Java 下载文件随机卡住

python - 在Python中使用MPI(mpi4py)的分散来分割向量处理

java - 从未收到 SSH 服务器标识 - 握手死锁 [SSHJ]

c - 内核 block 设备 - 使用自旋锁陷入死锁