在Fortran中写入磁盘的效率

时间:2017-04-26 14:38:32

标签: fortran disk

我正在尝试将fortran中的一堆大型矩阵写入磁盘。 矩阵为VCd。所有内容都有(2 , n1, n2, n3, n4, n5).

这些是大型矩阵。 fortran花了大约3个小时来写它们。

do ind1=1,n1
do ind2=1,n2
do ind3=1,n3
do ind4=1,n4

     write(filename,'(a,i0,a,i0,a,i0,a,i0,a,i0,a)')'PF',t,'_',ind1,'_',ind2,'_',ind3,'_',ind4,'.txt'

     OPEN(UNIT=25,FILE=filename,STATUS='replace',ACTION='write')
     do ind5=1,n5
      WRITE(25,*) c(2,ind1,ind2,ind3, ind4,ind5)
     end do
     do ind5=1,n5
      WRITE(25,*) v(2,ind1,ind2,ind3, ind4,ind5)
     end do
     do ind5=1,n5
      WRITE(25,*) d(1,ind1,ind2,ind3, ind4,ind5)
     end do
     CLOSE(UNIT=25)

end do
end do
end do
end do

更快地做到这一点的聪明方法?

1 个答案:

答案 0 :(得分:4)

首先我要说的是我同意这些意见,最好的方法是转向HDF5或NetCDF,这样既可以提供数据的可移植性,又可以提供高性能。

如果你想坚持使用简单的Fortran I / O,通常最好将I / O事务的数量保持在最低水平。我怀疑你的所有打开都不是一个好主意,我会把它全部放在一个文件中。如果可以,那么你有3条路线,如下所示,并在我的笔记本电脑上运行(当然它有一个SSD)。无论如何它应该给你一些想法。

ian-admin@agon ~/test $ cat io.f90
Program test_io

  Implicit None

  Integer, Parameter :: wp = Selected_real_kind( 12, 70 )

  Integer, Parameter :: n1 = 201
  Integer, Parameter :: n2 = 50
  Integer, Parameter :: n3 = 2
  Integer, Parameter :: n4 = 2
  Integer, Parameter :: n5 = 21

  Real( wp ), Dimension( 1:2, 1:n1, 1:n2, 1:n3, 1:n4, 1:n5 ) :: stuff

  Integer :: start, finish, rate

  Integer :: i1, i2, i3, i4, i5

  Call Random_Number( stuff )

  Call System_Clock( start, rate )
  Do i1 = 1, n1
     Do i2 = 1, n2
        Do i3 = 1, n3
           Do i4 = 1, n4
              Do i5 = 1, n5
                 Write( 10, * ) stuff( 1, i1, i2, i3, i4, i5 )
              End Do
           End Do
        End Do
     End Do
  End Do
  Call System_Clock( finish, rate )
  Write( *, * ) 'Loops : ', Real( finish - start ) / Real( rate )

  Call System_Clock( start, rate )
  Write( 11, * ) stuff( 1, :, :, :, :, : )
  Call System_Clock( finish, rate )
  Write( *, * ) 'Array : ', Real( finish - start ) / Real( rate )

  Call System_Clock( start, rate )
  Write( 12 ) stuff( 1, :, :, :, :, : )
  Call System_Clock( finish, rate )
  Write( *, * ) 'Unform: ', Real( finish - start ) / Real( rate )

End Program test_io
ian-admin@agon ~/test $ gfortran -O -Wall -Wextra -std=f2003 io.f90
ian-admin@agon ~/test $ ./a.out
 Loops :    2.28500009    
 Array :    1.80200005    
 Unform:    5.79999983E-02
ian-admin@agon ~/test $