getdomainname()返回MPI下的错误地址(测试PETSc库)

时间:2012-06-01 01:46:40

标签: c macos mpi mpich unistd.h

我正在尝试在我的笔记本电脑上安装PETSc-3.2(MacBook Pro 10.5.8,MPICH2-1.1),并且在运行测试时遇到了一些困难:它从系统调用错误getdomainname()返回一个错误的地址。

[-1]PETSC ERROR: --------------------- Error Message ------------------
[-1]PETSC ERROR: Error in system call!
[-1]PETSC ERROR: getdomainname()!
[-1]PETSC ERROR: ------------------------------------------------------

为了调查,我编写了以下测试代码来检查带有和不带MPI的getdomainname()的功能:

单处理器:

#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()。在没有调试的情况下进行编译会禁用库中的此分支。

1 个答案:

答案 0 :(得分:2)

尝试更新版本的MPICH2,1.1很老。除非您要求,否则当前版本不应向-m32添加任何-m64 / mpicc个参数。 (我不确定旧版本是否也这样做,但这是可能的)