【问题标题】:getdomainname() returns bad address under MPI (testing PETSc library)getdomainname() 在 MPI 下返回错误地址(测试 PETSc 库)
【发布时间】:2012-06-06 06:58:51
【问题描述】:

我正在尝试在我的笔记本电脑(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()。在不调试的情况下编译会禁用库中的这个分支。

【问题讨论】:

  • 这是 x86_64 还是 IA-32 系统?会不会是 MPI 编译器和非 MPI 测试适用于不同的架构?
  • 好电话,我什至没想到!我的 MPI 编译器自动使用-m64。我用-m64 重新编译了我的单处理器代码,但它停止了工作......是解决这个问题的方法还是我应该在没有-m64 的情况下编译所有东西?请把这个放在答案中。

标签: c macos mpi mpich unistd.h


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 2012-03-02
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2010-12-18
    相关资源
    最近更新 更多