Недавно я работал с MPI. Я все еще очень новичок в MPI. Но недавно я обнаружил проблему при использовании MPICH2. Вот моя небольшая программа на фортране 90, модифицированная из программы Hello world. Я не тестировал версию c, но думаю, что они должны быть очень похожи (отличаться именем функции и параметром ошибки).
Я работаю над 64-разрядной версией Windows 7, MinGW (версия gcc 4.6.2, 32-разрядный компилятор) и использую 32-разрядную версию MPICH2 1.4.1-p1. Вот команда, которую я использовал для компиляции простого кода:
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, так как он отлично работает, если я удалю эту строку. И это также работает, если я делаю матрицу меньше. Я попробовал это на машине с Ubuntu с той же версией MPI. В линуксе проблем нет.
Когда я использую 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 ?? ()
Означает ли это на самом деле, что что-то не так с библиотекой MPI версии Windows? Каким будет решение, чтобы заставить его работать?
Спасибо.
(36+36+1)**3
, который является размером передаваемого массива. - person mgilson   schedule 05.09.2012