我正在使用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;