Ошибка MPI_Allreduce в MPICH2

Недавно я работал с 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? Каким будет решение, чтобы заставить его работать?

Спасибо.


person FortCpp    schedule 03.09.2012    source источник
comment
что 389017 , часть mpi_bcast int count мне не подходит   -  person pyCthon    schedule 04.09.2012
comment
также, чтобы проверить, работает ли библиотека mpi, почему бы не найти хороший пример mpi hello world и посмотреть, компилируется ли он   -  person pyCthon    schedule 04.09.2012
comment
@pyCthon Возможно, вы правы, я получил более прямое сообщение об ошибке с openmpi: [20989] *** Произошла ошибка в MPI_Bcast [20989] *** на коммуникаторе MPI_COMM_WORLD [20989] *** MPI_ERR_TYPE: недопустимый тип данных [20989] * ** MPI_ERRORS_ARE_FATAL (до свидания)   -  person Vladimir F    schedule 04.09.2012
comment
Это на самом деле отлично сработало для меня теперь, когда мне дали возможность запустить код, я тестировал mpif90 gcc45 4.5.4_1, так что это определенно ошибка, связанная с Windows.   -  person pyCthon    schedule 04.09.2012
comment
Спасибо pyCthon. Как я уже сказал, код работает на машине с Linux, но не работает, если вы используете MinGW + MPICH2 1.4.1p1. Я скачал MPI с официального сайта MPICH2. Я задам этот вопрос в их списке рассылки, чтобы узнать, есть ли у них ответ.   -  person FortCpp    schedule 04.09.2012
comment
Я хочу протестировать MPI_Allreduce. Код Hello world работает на всех платформах. Поэтому я добавляю MPI_Allreduce в Hello world, просто хочу протестировать его.   -  person FortCpp    schedule 04.09.2012
comment
@pyCthon - мне 389017 подходит. Это (36+36+1)**3, который является размером передаваемого массива.   -  person mgilson    schedule 05.09.2012


Ответы (1)


Это может не решить вашу проблему, но MPI_INT не является типом данных fortran-mpi. MPI_INTEGER — соответствующий тип данных. Различные реализации могут предоставлять MPI_INT на стороне фортрана, но я почти уверен, что это не определено стандартом. Попробуйте скомпилировать свой код с помощью IMPLICIT NONE и посмотреть, жалуется ли он (также проверьте, если MPI_INTEGER .ne. MPI_INT). Если он жалуется, то происходит то, что компилятор присваивает MPI_INT какое-то значение (или ваша версия MPI использует MPI_INT для какого-то другого типа данных...). Это может противоречить одному из предопределенных значений, установленных MPI. Таким образом, он обрабатывает ваш массив целых чисел как какой-то другой тип, что может привести к переполнению буфера, что может проявляться самыми забавными способами.

person mgilson    schedule 05.09.2012
comment
Большое спасибо мгилсон. Хотя это не решает проблему MPI_Allreduce, это хороший момент! MPI_INTEGER и MPI_INT разные. У них разные значения (1275069467 и 1275069445). Но даже когда я добавляю неявный none, об этом нет сообщения об ошибке. Ты прав. Я должен использовать MPI_INTEGER вместо MPI_INT. - person FortCpp; 05.09.2012