gpt4 book ai didi

fortran - 多维数组的存储 fortran 90

转载 作者:行者123 更新时间:2023-12-04 04:35:40 27 4
gpt4 key购买 nike

我有

module mymod
contains
subroutine mysub(matrix_dum, i_size, j_size)
integer :: i, j, i_size, j_size
real(8), dimension(:,:) matrix_dum
do j=1, j_size
do i = 1, i_size
matrix_dum(i,j) = 11.d0*matrix_dum(i,j)
end do
end do
end subroutine mysub
end module mymod

program main
use mymod
implicit none
real(8), dimension(:,:,:), pointer :: matrix
integer :: i, num_matrices, i_size, j_size
num_matrices = 11
i_size = 5000
j_size = 6000
!only one of them are uncommented in actual practice
!I have two choices this choice takes a very very long time
allocate(matrix(num_matrices,i_size,j_size))
matrix = 11.d0
do i = 1, num_matrices
call mysub(matrix(i,:,:),i_size,j_size)
end do

!this one does the same job instantly
allocate(matrix(i_size,j_size,num_matrices))
matrix = 11.d0
do i = 1, num_matrices
call mysub(matrix(:,:,i),i_size,j_size)
end do
deallocate(matrix)
end program main`

为什么第二个像我预期的那样工作,但第一个没有。我知道这一定是 Fortran 将多维数组存储在一行一个接一个的内存位置的方式。但我不确定我的语法。我是否正确传递了矩阵的地址?或者我告诉它复制整个矩阵而不是给它地址。如何将指针传递给多维数组的一部分?这是怎么回事?

最佳答案

通常 Fortran 处理器以语言定义的数组元素顺序存储数组 - 这样最左边的下标在您从一个元素移动到另一个元素时变化最快。

因此 matrix(:,:,1) 的所有元素将是连续的 - 彼此相邻。

如果 SIZE(matrix,1)/= 1,matrix(1,:,:) 的元素将不连续。

对不按数组元素顺序或不连续的数组的操作通常较慢(例如,它们可能不太适合缓存,或者在某些情况下可能需要构建中间临时数组)。

关于fortran - 多维数组的存储 fortran 90,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19781811/

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