我最近與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庫? 什麼是解決方案,使其工作?
謝謝。
那389017,int計數部分mpi_bcast看起來不對我 – pyCthon
還測試如果mpi庫工作,爲什麼不找到一個很好的mpi hello世界的例子,看看是否編譯 – pyCthon
@pyCthon你可能[20989] *** MPI_Bcast發生錯誤 [20989] ***在通信器上MPI_COMM_WORLD [20989] *** MPI_ERR_TYPE:無效的數據類型 [20989] *** MPI_ERRORS_ARE_FATAL(再見) –