在 FORTRAN 90 中使用 MPI_Type_Create_Subarray

Posted

技术标签:

【中文标题】在 FORTRAN 90 中使用 MPI_Type_Create_Subarray【英文标题】:Using MPI_Type_Create_Subarray in FORTRAN 90 【发布时间】:2013-10-29 21:26:37 【问题描述】:

这与“在 Fortran 90 中使用 MPI_Send/Recv 处理多维数组块”的早期线程有关。我的数组是真实的,3-dim 说 5 x 5 x 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

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

【问题讨论】:

【参考方案1】:

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

来自MPI 3.0 Standard, Ch. 4.1.3:

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

【讨论】:

感谢您的信息。如果一个数组从一个负索引开始,比如父数组 x(-n:n,-m:m),我想发送块 x(-2:0,:),会发生什么?现在应该是什么起始数组? @Madhurjya,-2-n 的偏移量是(-2)-(-n) = n-2。对于第二个维度,偏移量是0 感谢 Alexander 和 Hristo!讨论确实帮助了我很多。

以上是关于在 FORTRAN 90 中使用 MPI_Type_Create_Subarray的主要内容,如果未能解决你的问题,请参考以下文章

将python嵌入fortran 90

在 FORTRAN 90 中使用 MPI_Type_Create_Subarray

Fortran 90 中是不是有更好的双精度赋值?

在 Fortran90 中从文本文件中跳过一行

无法从 Fortran 90 中返回的 C 浮点指针获取数据

如何在 Fortran 90 中跳过带有“#”符号的行? [复制]