未调用函数中的代码导致 MPI 程序在跨节点时失败

问题描述 投票:0回答:0

我正在使用mpiP跟踪MPI程序,并对mpiP进行一些修改。我想记录MPI函数参数信息,所以我创建了一个缓冲区。 我在下面的 mpiPi.h 中添加了一个 list_t 结构:

typedef struct
{
  int size;
  int capacity;
  char *data;
} list_t;

我还在 mpiPi.c 中为此结构添加了一些函数调用(但尚未调用):

void list_init(list_t *list)
{
  list->size = 0;
  list->capacity = 65536;
  list->data = (char*)malloc(list->capacity*sizeof(char));
  if(list->data == NULL)
  {
    printf("error: insufficient memory for initializing list\n");
  }
}
void list_finalize(list_t *list)
{
  free(list->data);
}
void list_push(list_t *list, char *item)
{
  if (list == NULL) return;
  int item_size;
  item_size = strlen(item);
  if(list->size + item_size >= list->capacity) {
     list->capacity = list->capacity*2;
     list->data = (char*)realloc(list->data, list->capacity*sizeof(char));
  }
  if(list->data == NULL) {
    printf("error: insufficient memory for pushing an item\n");
  }
   else {
   strcpy(&list->data[list->size], item);
   list->size = list->size + item_size;
  }
}

添加上面所有这些代码后,我发现所有 MPI 程序在跨节点时都因我修改的 mpiP 而失败,但在使用单节点时它有效。注释掉某行list_push后,就可以正常工作了。失败如下所示,我的 slurm 错误日志中没有提供更多信息。

An ORTE daemon has unexpectedly failed after launch and before
communicating back to mpirun. This could be caused by a number
of factors, including an inability to create a connection back
to mpirun due to a lack of common network interfaces and/or no
route found between them. Please check network connectivity
(including firewalls and network routing requirements).

我注释掉后使 MPI 程序工作的行是:

    list->data = (char*)realloc(list->data, list->capacity*sizeof(char));
    strcpy(&list->data[list->size], item);
    list->size = list->size + item_size;

我很困惑,我只是decalre这个函数,从来没有调用过,为什么三行会报这个错?我怎样才能避免这个问题?

MPI 版本:3.1.0

gcc 版本:4.8.5

Linux uname:Linux sh3login06 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

我组合了哪一行导致了这个问题,我发现list_push中有3行导致了这个问题

    list->data = (char*)realloc(list->data, list->capacity*sizeof(char));
    strcpy(&list->data[list->size], item);
    list->size = list->size + item_size;
mpi trace slurm openmpi
© www.soinside.com 2019 - 2024. All rights reserved.