我正在尝试在我的笔记本电脑(MacBook Pro 10.5.8,MPICH2-1.1)上安装 PETSc-3.2,并且在运行测试时遇到了一些困难:它从getdomainname()
返回错误地址的系统调用中出错。
[-1]PETSC ERROR: --------------------- Error Message ------------------
[-1]PETSC ERROR: Error in system call!
[-1]PETSC ERROR: getdomainname()!
[-1]PETSC ERROR: ------------------------------------------------------
为了进行调查,我编写了以下测试代码来检查getdomainname()
使用和不使用 MPI 的功能:
单处理器:
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *name;
int namelen = CHAR_MAX;
name = (char*) calloc (namelen,sizeof(char));
int err = getdomainname(name,namelen);
printf("%s\n",strerror(errno));
printf("Domain name: %s\n",name);
return err;
}
平行线:
/* Headers */
#include "mpi.h"
int main(int argc, char **argv)
{
MPI_Init(&argc,&argv);
int myrank;
char *mpi_name;
int mpi_namelen = MPI_MAX_PROCESSOR_NAME;
mpi_name = (char*) calloc (mpi_namelen,sizeof(char));
MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
int mpi_err = MPI_Get_processor_name(mpi_name,&mpi_namelen);
printf("MPI_Get_processor_name [%d]: %s\n",mpi_err,mpi_name);
char *name;
int namelen = CHAR_MAX;
name = (char*) calloc (namelen,sizeof(char));
int err = getdomainname(name,namelen);
printf("%s\n",strerror(errno));
printf("Domain name: %s\n",name);
return err;
MPI_Finalize();
}
单处理器代码正常工作,并行代码获取处理器的正确名称,但在调用时返回错误地址,getdomainname()
即使使用mpirun -np 1
.
有没有人遇到过这样的问题?是否需要进行某种配置,mpirun
以便为 MPI 生成的每个进程设置域名?提前致谢!
更新:
对于那些使用 PETSc 遇到此问题的人,请使用选项--with-debugging=0
. 似乎在一些 PETSc 调试消息等中,他们使用调用getdomainname()
而不是MPI_Get_processor_name()
. 在不调试的情况下编译会禁用库中的这个分支。