2012-09-03 70 views
3

我最近與MPI合作。我對MPI還很陌生。但是我最近在使用MPICH2時發現一個問題。這是我的小Fortran 90程序,從Hello world程序修改而來。我沒有測試它的c版本,但我認爲它們應該非常相似(不同之處在於函數名稱和錯誤參數)。MPI_Allreduce失敗MPICH2

我正在使用Windows 7 64bit,MinGW(gcc版本4.6.2,它是32位編譯器)並使用MPICH2 1.4.1-p1 32位版本。這裏是我用來編譯簡單代碼的命令:

gfortran hello1.f90 -g -o hello.exe -IC:\MPICH2_x86\include -LC:\MPICH2_x86\lib -lfmpich2g 

這裏是簡單的代碼:

program main 
    include 'mpif.h' 
    character * (MPI_MAX_PROCESSOR_NAME) processor_name 
    integer myid, numprocs, namelen, rc,ierr 
    integer, allocatable :: mat1(:, :, :) 

    call MPI_INIT(ierr) 
    call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) 
    call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr) 
    call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr) 

    allocate(mat1(-36:36, -36:36, -36:36)) 
    mat1(:,:,:) = 0 
    call MPI_Bcast(mat1(-36, -36, -36), 389017, MPI_INT, 0, MPI_COMM_WORLD, ierr) 
    call MPI_Allreduce(MPI_IN_PLACE, mat1(-36, -36, -36), 389017, MPI_INTEGER, MPI_BOR, MPI_COMM_WORLD, ierr) 
    print *,"MPI_Allreduce done!!!" 
    print *,"Hello World! Process ", myid, " of ", numprocs, " on ", processor_name 
    call MPI_FINALIZE(rc) 
    end 

可以編譯,但在運行時,但它沒有(也許無效的內存訪問?)。 MPI_Allreduce必須有一些問題,因爲如果我刪除該行,它工作正常。如果我使矩陣更小,它也可以工作。我在具有相同版本MPI的ubuntu機器上嘗試了它。在Linux中沒有問題。

當我使用gdb(自帶MinGW)來檢查(gdb hello.exe然後回溯)。我得到的東西沒有意義的(或者似乎是爲自己):

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 16316.0x4fd0] 
0x01c03100 in mpich2nemesis!PMPI_Wtime() 
    from C:\Windows\system32\mpich2nemesis.dll 
(gdb) backtrace 
#0 0x01c03100 in mpich2nemesis!PMPI_Wtime() 
    from C:\Windows\system32\mpich2nemesis.dll 
#1 0x0017be00 in ??() 
#2 0x00000000 in ??() 

,這實際上意味着有一些錯誤的Windows版本MPI庫? 什麼是解決方案,使其工作?

謝謝。

+0

那389017,int計數部分mpi_bcast看起來不對我 – pyCthon

+0

還測試如果mpi庫工作,爲什麼不找到一個很好的mpi hello世界的例子,看看是否編譯 – pyCthon

+0

@pyCthon你可能[20989] *** MPI_Bcast發生錯誤 [20989] ***在通信器上MPI_COMM_WORLD [20989] *** MPI_ERR_TYPE:無效的數據類型 [20989] *** MPI_ERRORS_ARE_FATAL(再見) –

回答

3

這可能無法解決您的問題,但MPI_INT不是fortran-mpi數據類型。 MPI_INTEGER是相應的數據類型。不同的實現可能會在Fortran端提供MPI_INT,但我很確定這不是由標準定義的。嘗試編譯你的代碼IMPLICIT NONE,看看它是否有抱怨(也測試MPI_INTEGER .ne. MPI_INT)。如果它抱怨,發生的事情是MPI_INT正在被編譯器賦值(或者你的MPI版本使用MPI_INT來表示某些其他數據類型......)。這可能與MPI設置的預定義值之一相沖突。因此,它將您的整數數組視爲可能導致緩衝區溢出的其他類型,這可能會以各種有趣的方式表現出來。

+0

非常感謝mgilson。雖然它不能解決MPI_Allreduce問題,但這是一個很好的觀點! MPI_INTEGER和MPI_INT不同。他們有不同的值(1275069467和1275069445)。但即使當我添加隱式沒有,也沒有關於它的錯誤消息。你是對的。我應該使用MPI_INTEGER而不是MPI_INT。 – FortCpp