我是 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 时我在这里误解了什么?
我最后打印的是最后一行而不是最后一列。问题在于打印,而不是发送/接收