2012-06-01 10 views
1

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

[-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(); 
} 

单处理器代码没有问题,并行代码得到正确的n即使与mpirun -np 1一起运行,也会返回getdomainname()的错误地址。

有没有人遇到过这样的问题? mpirun是否需要进行某种配置,以便为MPI生成的每个进程设置域名?提前致谢!

更新:

对于运行到这个问题的PETSc,编译选项--with-debugging=0。似乎在一些PETSc调试消息中,他们使用getdomainname()而不是MPI_Get_processor_name()。在不调试的情况下编译禁用库中的这个分支。

+1

这是x86_64还是IA-32系统? MPI编译器和非MPI测试是否适用于不同的体系结构? –

+0

好的通话,我甚至没有想到!我的MPI编译器自动使用'-m64'。我用'-m64'重新编译了我的单处理器代码,并且它停止工作了...是解决这个问题的一种方法,还是应该编译所有没有'-m64'的东西?请把它放在一个答案中。 – Mosby

回答

2

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