如何使用 mpi 在 Fortran 中发送数组列

问题描述 投票:0回答:1

我是 mpi 新手,正在学习如何做事。我试图使用 Fortran 发送数组列,但遇到了我不明白的问题。这是一个使用阻塞发送接收的初学者示例

我有一个 6x6 数组 A,我正在尝试将其第 6 列从偶数进程复制到奇数进程 所以我有

program lala
        implicit none
        include 'mpif.h'

        integer:: i,j
        integer, allocatable :: A(:,:)
        integer :: mpierr,mpistatus
        integer :: ntasks, taskid


        call mpi_init(mpierr)
        call mpi_comm_size(mpi_comm_world,ntasks,mpierr)
        call mpi_comm_rank(mpi_comm_world,taskid,mpierr)
        allocate(A(6,6))
        A=taskid

if (mod(taskid,2).eq.0) then
          call mpi_send(A(1,6),6,mpi_integer,taskid+1,1,
     &          mpi_comm_world,mpierr)
else
        call mpi_recv(A(1,6),6,mpi_integer,taskid-1,1,
     &          mpi_comm_world,mpistatus,mpierr)
end if
        print*, 'pid=',taskid, 'A1to6=',A(6,1:6)
call mpi_finalize(mpierr)
end program

由于 Fortran 数组是按列存储的,因此指向列的第一个元素应该在我的脑海中起作用。

但是,当我输出相同的内容时,只有 A(6,6) 被替换,例如对于过程3 pid=3 A1to6=3 3 3 3 3 2

如果我创建一个临时数组 B(1:6),然后复制 A(:,6) 列并发送 B,那么一切正常。我不确定两者之间有什么区别。我也尝试使用 A(1:6,6) 发送和接收,但仍然得到与以前相同的结果。使用完整数组 A 时我在这里误解了什么?

fortran mpi
1个回答
0
投票

我最后打印的是最后一行而不是最后一列。问题在于打印,而不是发送/接收

© www.soinside.com 2019 - 2024. All rights reserved.