Использовать MPI_type_contiguous и MPI_Type_CREATE_Subarray в структуре FORTRAN 90 - PullRequest
0 голосов
/ 18 марта 2011

Привет Я пытаюсь использовать структуру Fortran, как это

type some
   u                ! actual code will have 17 such scalars
end type some
TYPE(some),ALLOCATABLE,DIMENSION(:) :: metvars,newmetvars

Теперь цель моей тестовой программы - отправить 10 чисел с одного процессора на другой, но отправной точкой этих 10 чисел будет мой выбор (например, если у меня есть вектор, скажем, 20 чисел, не являющийся необходимым, я возьму первое 10 номеров до следующего процессора, но допустим, мой выбор от 5 до 15). Итак, сначала вы используете mpi_type_contiguous, как это

 CALL MPI_TYPE_CONTIGUOUS(10,MPI_REAL,MPI_METVARS,ierr) ! declaring a derived datatype of the object to make it in to contiguous memory
 CALL MPI_TYPE_COMMIT(MPI_METVARS,ierr)

Я отправил запись и смог получить первые 10 чисел на другой процессор (я проверяю его на 2 процессора)

 if(rank.EQ.0)then
     do k= 2,nz-1
     metvars(k)%u = k
     un(k)=k
     enddo
 endif

Я отправляю это

сейчас для второй части я использовал mpi_TYPE_CREATE_SUBARRAY так то

   array_size = (/20/)
   array_subsize =(/10/)
   array_start = (/5/)

   CALL MPI_TYPE_CREATE_SUBARRAY(1,array_size,array_subsize,array_start,MPI_ORDER_FORTRAN,MPI_METVARS,newtype,ierr)
   CALL MPI_TYPE_COMMIT(newtype,ierr)

   array_size = (/20/)
   array_subsize =(/10/)
   array_start = (/0/)

   CALL MPI_TYPE_CREATE_SUBARRAY(1,array_size,array_subsize,array_start,MPI_ORDER_FORTRAN,MPI_METVARS,newtype2,ierr)
   CALL MPI_TYPE_COMMIT(newtype2,ierr)

  if(rank .EQ. 0)then
     CALL MPI_SEND(metvars,1,newtype,1,19,MPI_COMM_WORLD,ierr)
  endif

  if(rank .eq. 1)then
     CALL MPI_RECV(newmetvars,1,newtype2,0,19,MPI_COMM_WORLD,MPI_STATUS_IGNORE,ierr)
  endif

Я не понимаю, как это сделать.

Я получаю сообщение об ошибке

[flatm1001:14066] *** An error occurred in MPI_Recv
[flatm1001:14066] *** on communicator MPI_COMM_WORLD
[flatm1001:14066] *** MPI_ERR_TRUNCATE: message truncated
[flatm1001:14066] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)

Я использую openmpi на моей локальной машине. Я смог использовать команду subarray без части mpi_type_contiguous. Однако, если я объединю оба, потому что в этом случае мне нужно сделать это, так как у меня есть структура с fortran в реальном коде. Я не знаю, если есть лучший способ сделать это либо. Любая помощь и предложения приветствуются. Заранее спасибо

1 Ответ

0 голосов
/ 20 марта 2011

Я предполагаю, что ваш пользовательский тип содержит 1 вещественное число, поскольку оно не указано.Сначала вы строите константный тип из 10 этих переменных, то есть MPI_METVARS представляет 10 смежных действительных чисел.Теперь я не знаю, действительно ли это проблема, так как код, который вы разместили, может быть неполным, но теперь он выглядит так, как будто вы создаете подмассив из 10 типов MPI_METVARS, что означает, что у вас фактически 100 смежных реалов в newtype.и newtype2.

«Правильный» способ обработки структуры - создать для нее тип с помощью MPI_TYPE_CREATE_STRUCT, который должен быть вашим типом MPI_METVARS.

Итак, просьба предоставить правильный кодПользовательский тип и проверьте размер нового типа.

...