在FORTRAN 90中使用MPI_Type_Create_Subarray

时间:2013-10-21 11:45:15

标签: parallel-processing fortran mpi fortran90 array-splice

这与早期的“使用MPI_Send / Recv处理Fortran 90中的多调度数组块”的线程有关。我的数组是实数,3-Dim表示5乘5乘5,即x(1:5,1:5,1:5)如果我想发送我的数组的以下部分说

x(2:3,2:5,4:5)
从0开始到Proc 1,我使用以下测试程序

program mpi
implicit none
include "mpif.h"

integer :: ierr,myid,nprocs,status(mpi_status_size),i,j,k,&
&          starts(3),newsize(3),oldsize(3)
real    :: x(1:5,1:5,1:5),y(1:5,1:5,1:5),z(2:3,2:5,4:5)
integer :: arr

call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world,myid,ierr)
call mpi_comm_size(mpi_comm_world,nprocs,ierr)

if(myid == 0) then
  x = 0.0
  call random_number(x)
  starts = (/2,2,4/)
  newsize = (/2,4,2/)
  oldsize = (/5,5,5/)
  call mpi_type_create_subarray(3,oldsize,newsize,starts,mpi_order_fortran, &
  & mpi_real,arr,ierr)
  call mpi_type_commit(arr,ierr)
  call mpi_send(x,1,arr,1,1,mpi_comm_world,ierr)
  do i = 2,3
    do j = 2,5
      do k = 4,5
        print*,'#1',x(i,j,k)
      enddo
    enddo
  enddo
  print*,' '
else
  y = 0.0
  call mpi_recv(z,16,mpi_real,0,1,mpi_comm_world,status,ierr)
  do i = 2,3
    do j = 2,5
      do k = 4,5
        print*,'#2',z(i,j,k)
      enddo
    enddo
  enddo
endif

call mpi_finalize(ierr)

stop
end

我收到与'start'数组相关的运行时错误。它的元素必须是0或1.我在这里缺少什么?这个的正确形式是什么?我找不到使用它的FORTRAN示例。

1 个答案:

答案 0 :(得分:1)

该标准指定array_of_starts(您的starts)开始索引为零,而不是一个!因此,如果Fortran编号从1开始,则必须减去1。因此,您的starts数组应为(/ 1, 1, 3 /)

来自MPI 3.0 Standard, Ch. 4.1.3

  

给用户的建议。在Fortran程序中,数组索引起始   从1开始,如果是特定维度的起始坐标   subarray是N,那么该维度的array_of_starts中的条目是   n-1个。 (结束对用户的建议。)