2012-06-01 16 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。 (我不確定舊版本是否也這樣做,但有可能)