gpt4 book ai didi

arrays - 是否有任何理由按第一项传递数组?

转载 作者:行者123 更新时间:2023-12-02 18:36:42 24 4
gpt4 key购买 nike

在一个相当旧的 Fortran 项目中,当数组由其第一项传递时,我经常看到这种模式:

program test
implicit none
integer :: a(10)
a(:) = 1
call sub(a(1), 10) ! here
contains
subroutine sub(a, length)
integer, intent(in) :: length
integer, intent(in) :: a(length)
print *, a
end subroutine
end program

它可能在哪里:

    call sub(a, 10) ! here

即使在 Fortran 77 中也是有效的。

请注意,必须明确传递和使用数组的大小,这对于假定形状的数组不起作用:

    subroutine sub(a)
integer, intent(in) :: a(:)
print *, a
end subroutine

对我来说,这很令人困惑,因为调用表明标量被传递给子例程。我想它是有效的,因为数组是通过引用传递的。

有什么理由要传递这样的数组,尤其是现在?

最佳答案

当使用非阻塞 MPI 例程的旧接口(interface)时,会使用此功能。

假设您想要传递子数组 A(10,10:19),它是更大数组 A(1:100,1:100) 的一部分。

如果你通过了

use mpi
call ISend(A(10,10:19), 10, MPI_REAL, ...

您传递了数组 A 的临时副本,并且该临时副本的地址在 MPI_Wait 时无效。因此,您可以创建一个 MPI 派生类型,它描述要发送的数组中的偏移量,并将其用作

use mpi
call ISend(A(10,10), 1, derived_type, ...

当然,对于最现代的 MPI 库和编译器,您可以使用 mpi_f08。然而,大多数 HPC 代码尚未使用它。

另一个解决方案是使用包含子数组的绝对地址的 MPI 派生类型并仅传递 A。有时它很实用,有时则不然。这取决于传递的子数组在整个代码中的变化程度。

请注意,旧界面中的非阻塞 MPI 还存在其他问题,如果您将例程显式标记为异步,则会有所帮助。

关于arrays - 是否有任何理由按第一项传递数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68675670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com