Fortran 90可分配的auto(?)分配

李相俊
program test

    implicit none
    real(dp),allocatable :: a(:), b(:)

    allocate (a(10))

    a = 1.d0
(*) b = a

end program

在上面的代码中,我设置了两个可分配变量-ab-,并且仅a在代码中分配了。我希望代码无法编译,但是编译良好,并且似乎在下面的代码(显示类似功能)显示SEGFAULT的情况下工作良好。

program test_fail

   implicit none
   real(dp),allocatable :: a(:), b(:)
   integer              :: i

   allocate ( a(10) )

   a = 1.d0

   do i = 1, 10
      b(i) = a(i)
   enddo

end program

可以理解以前的代码会b自动分配吗?

subroutine test_sub(a)

   implicit none

   real(dp),intent(inout) :: a(:,:)

   ...

end program

而且在上述带有整形数组输入的子例程中,是否可以理解代码会自动检测输入数组的大小a,并在子例程中分配其自己的数组并将其分配回上一级框架,这还不错吗?

最后,将数组复制到另一个数组时哪个更快?

program speed1

  implicit none
  real(dp), allocatable :: a(:,:,:), b(:,:,:)

  allocate( a(10000,10000,10000) )

  a = 1.d0

  b = a

end program
program speed2

  implicit none
  real(dp), allocatable :: a(:,:,:), b(:,:,:)
  integer               :: i, j, k

  allocate( a(10000,10000,10000), b(10000,10000,10000) )

  a = 1.d0

  do i = 1,10000
    do j = 1,10000
      do k = 1,10000
        b(i,j,k) = a(i,j,k)
      enddo
    enddo
  enddo

end program
乔纳坦·厄斯特罗姆(JonatanÖström)

让我扩展我的评论作为答案。

第一代码剪断编译因为b需要的形状a,在分配b=a,这是Fortran标准特征

第二片段是错误的:未分配的阵列不能被索引,它没有形状或条目。因此存在段错误。

(在这种简单情况下,编译器可以很容易地在编译时检测到该错误并给出错误。但是可分配数组可以在子例程之间传递,并在那里进行分配/取消分配,这使得在一般情况下很难检测到该错误。这就是为什么,我想此检查尚未完成。)

第三代码段:一个assumed-shape阵列a(:,:)在子程序/函数的参数,采用的形状和阵列的值被传递给该例程。(通常)它将是对同一内存的引用。

第4个和第5个代码段:Fortran数组的column-major意思是最左边的索引应该是最里面的循环等,以加快执行速度。喜欢:

do k = 1, n
    do j = 1, n
        do i = 1, n
            b(i,j,k) = a(i,j,k)

但是,在简单情况下,编译器将在应用优化时(例如使用gfortran -O3解决此问题

由于b未使用,可能是编译器在两种情况下都删除了复制操作。

复制很少会遇到瓶颈,因此b=a无论性能如何,我都会使用它,因为它很清楚而且很简短。无论如何,上面的循环a=b可能与编译器等效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Fortran 90在声明可分配数组方面的差异

来自分类Dev

使用Fortran 90将txt文件读入可分配数组时,结果错误

来自分类Dev

Fortran 90在声明可分配数组方面的差异

来自分类Dev

在C中为Fortran可分配的内存

来自分类Dev

Fortran函数返回可分配数组

来自分类Dev

Intel Fortran错误“未分配可分配数组或指针”

来自分类Dev

在Fortran90 +中具有可分配组件的数据类型的二进制读/写

来自分类Dev

为什么在Fortran中需要可分配数组?

来自分类Dev

FORTRAN-子例程中的可分配数组

来自分类Dev

fortran 77和gfortran中的可分配数组

来自分类Dev

为什么在Fortran中需要可分配数组?

来自分类Dev

恢复Fortran中不可分配的大型阵列的存储

来自分类Dev

写入 Fortran 可分配数组时出现访问冲突

来自分类Dev

复制到另一个可分配数组后,Fortran 90不会保持数组上下边界

来自分类Dev

调用C_F_POINTER时Fortran指针和Fortran可分配的差异

来自分类Dev

重置(取消分配/无效化)已损坏的Fortran可分配数组

来自分类Dev

重置(取消分配/无效化)已损坏的Fortran可分配数组

来自分类Dev

指针分配过程中的fortran 90预期范围规范

来自分类Dev

Fortran未分配的数组

来自分类Dev

将可分配数组从fortran传递到C并对其进行malloc

来自分类Dev

fortran,将可分配数组传递给具有右边界的子例程

来自分类Dev

用户定义类型的Fortran可分配数组成员

来自分类Dev

Fortran:派生类型的可分配数组,包含派生类型的数组

来自分类Dev

FORTRAN可分配数组。这一段代码的数学表示是什么?

来自分类Dev

如何在Fortran子例程中使用可分配数组?

来自分类Dev

用户定义的包含可分配数组的Fortran类型的OpenMP缩减

来自分类Dev

如何在GDB中打印可分配的fortran int64数组

来自分类Dev

CUDA-Fortran 设备数据结构中的可分配数组

来自分类Dev

Fortran派生类型分配

Related 相关文章

  1. 1

    Fortran 90在声明可分配数组方面的差异

  2. 2

    使用Fortran 90将txt文件读入可分配数组时,结果错误

  3. 3

    Fortran 90在声明可分配数组方面的差异

  4. 4

    在C中为Fortran可分配的内存

  5. 5

    Fortran函数返回可分配数组

  6. 6

    Intel Fortran错误“未分配可分配数组或指针”

  7. 7

    在Fortran90 +中具有可分配组件的数据类型的二进制读/写

  8. 8

    为什么在Fortran中需要可分配数组?

  9. 9

    FORTRAN-子例程中的可分配数组

  10. 10

    fortran 77和gfortran中的可分配数组

  11. 11

    为什么在Fortran中需要可分配数组?

  12. 12

    恢复Fortran中不可分配的大型阵列的存储

  13. 13

    写入 Fortran 可分配数组时出现访问冲突

  14. 14

    复制到另一个可分配数组后,Fortran 90不会保持数组上下边界

  15. 15

    调用C_F_POINTER时Fortran指针和Fortran可分配的差异

  16. 16

    重置(取消分配/无效化)已损坏的Fortran可分配数组

  17. 17

    重置(取消分配/无效化)已损坏的Fortran可分配数组

  18. 18

    指针分配过程中的fortran 90预期范围规范

  19. 19

    Fortran未分配的数组

  20. 20

    将可分配数组从fortran传递到C并对其进行malloc

  21. 21

    fortran,将可分配数组传递给具有右边界的子例程

  22. 22

    用户定义类型的Fortran可分配数组成员

  23. 23

    Fortran:派生类型的可分配数组,包含派生类型的数组

  24. 24

    FORTRAN可分配数组。这一段代码的数学表示是什么?

  25. 25

    如何在Fortran子例程中使用可分配数组?

  26. 26

    用户定义的包含可分配数组的Fortran类型的OpenMP缩减

  27. 27

    如何在GDB中打印可分配的fortran int64数组

  28. 28

    CUDA-Fortran 设备数据结构中的可分配数组

  29. 29

    Fortran派生类型分配

热门标签

归档