使用PGI Fortran生成许多随机数时出现分段错误

时间:2017-05-31 13:15:56

标签: random cuda fortran fortran95 pgi

我需要生成大量随机数(从0到1,均匀分布)。

我最初有一个Do循环并且正在生成随机数字:

Real :: RandomN
Integer :: N
DO N = 1, 10000
   Call RANDOM_NUMBER(RandomN)
   ... Some Code ...
ENDDO

但是,我在生成数字时遇到了分段错误(如果我注释掉了“call random_number(RandomN)”行,它就可以了。)

然后阅读了PGI论坛上的帖子(http://www.pgroup.com/userforum/viewtopic.php?t=713&highlight=randomseed)。我决定先生成所有数字并将它们放在一个数组中。

Real :: RndNum(1:10000,1:5)
Integer :: time(8), seed(2)
Call DATE_AND_TIME(values=time)     ! Get the current time 
seed(1) = time(4) * (360000*time(5) + 6000*time(6) + 100*time(7) + time(8))
Call RANDOM_SEED(PUT=seed)
Call RANDOM_NUMBER(RndNum)

然而,这给了我一个段落错误。我尝试了没有种子的简化版本:

Real :: RndNum(1:10000,1:5)
Call RANDOM_NUMBER(RndNum)

适用于我的代码的几次迭代 ,然后也会产生分段错误。我用了某种记忆吗?有没有办法清除它?或者防止它被用完?

我也尝试过:

CALL SYSTEM_CLOCK(count, count_rate, count_max)
CALL srand(count)

DO N=1, CAPN
   RndNum(N,1) = rand()
   RndNum(N,2) = rand()
   RndNum(N,3) = rand()
   RndNum(N,4) = rand()
   RndNum(N,5) = rand()
ENDDO

但这也是一个段错误。

1 个答案:

答案 0 :(得分:2)

你的种子数组太小了。获得这样的最小尺寸:

program testpgi
  Real :: RndNum(1:10000,1:5)
  Integer :: time(8), seed(2)
  Integer :: min_seed_size
  Call DATE_AND_TIME(values=time)     ! Get the current time 
  seed(1) = time(4) * (360000*time(5) + 6000*time(6) + 100*time(7) + time(8))

  Call RANDOM_SEED(SIZE=min_seed_size)
  write(*,*) min_seed_size
end program testpgi

我刚刚在PGI编译器上运行它,得到了34。如果我Integer :: seed(33),它会转储核心。如果我Integer :: seed(34),则不会。