XiaOaiX 发表于 2022-5-25 23:17:29

大数组的生成和reshape出错

本帖最后由 kyra 于 2022-5-26 08:44 编辑

program arraymult

implicit none
integer, parameter:: N=2000
integer :: i,j
real(16),dimension(N,N):: a=0._16, b=0._16,c0=0._16, c1=0._16
!real(16), dimension(N*N):: aa=0, bb=0, cc=0
character (len=20):: date,time
real :: tt0,tt1

   call date_and_time(date,time)
   print *, "date=", date, ";time=", time
   call cpu_time(tt0)
   a=reshape([(50._16-(N**2-1._16)/2.+i,i=1,N**2)],)
   b=reshape([(100._16-(N**2-1._16)/2.+i,i=1,N**2)],)
!   aa=reshape(a,)
!   bb=reshape(b,)
   call cpu_time(tt1)
   print *, "date=", date, ";time=", time
   print *, "reshape spend=", tt1-tt0
   call date_and_time(date,time)
   print *, "date=", date, ";time=", time
   call cpu_time(tt0)
   c0=matmul(a,b)
!   c0=matmul(c0,b)
!   c0=matmul(c0,b)
!   c0=matmul(c0,b)
!   c0=matmul(c0,b)
!   c0=matmul(c0,b)
!   c0=matmul(c0,b)
!   c0=matmul(c0,b)
   call date_and_time(date,time)
   call cpu_time(tt1)
   print *, "date=", date, ";time=", time
   print *, "multi spend=", tt1-tt0
!print *,"complete first"

end program


gfortran 编译没问题,运行不出错。但是Flang 编译后运行会出segment fault, ifort 好像也会出。到底是啥问题呢?

XiaOaiX 发表于 2022-5-25 23:21:30

貌似N=2000太大了, gfortran 编译时候加了选项-fmax-array-constructor=5000000 , flang 和ifort 要加啥选项呢

li913 发表于 2022-5-26 08:29:39

改为动态数组,根本上解决问题。

kyra 发表于 2022-5-26 08:43:10

   a=reshape([(50._16-(N**2-1._16)/2.+i,i=1,N**2)],)
   b=reshape([(100._16-(N**2-1._16)/2.+i,i=1,N**2)],)

这两个语句非常吃堆栈,建议还是老老实实的Do循环
页: [1]
查看完整版本: 大数组的生成和reshape出错