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

Random 使用PGI Fortran生成多个随机数时出现分段错误,random,cuda,fortran,fortran95,pgi,Random,Cuda,Fortran,Fortran95,Pgi,我需要生成大量随机数(从0到1,均匀分布) 我最初有一个Do循环,并动态生成随机数: Real :: RandomN Integer :: N DO N = 1, 10000 Call RANDOM_NUMBER(RandomN) ... Some Code ... ENDDO 然而,在生成数字时,我遇到了一个分段错误(如果我注释掉了“callrandom_number(RandomN)”行,它工作得很好) 然后在阅读PGI论坛()上的帖子后。我决定先生成所有数字,然后将它们放入一

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

我最初有一个Do循环,并动态生成随机数:

Real :: RandomN
Integer :: N
DO N = 1, 10000
   Call RANDOM_NUMBER(RandomN)
   ... Some Code ...
ENDDO
然而,在生成数字时,我遇到了一个分段错误(如果我注释掉了“callrandom_number(RandomN)”行,它工作得很好)

然后在阅读PGI论坛()上的帖子后。我决定先生成所有数字,然后将它们放入一个数组中

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

但这也会产生一个segfault。

您的种子数组太小。获得如下所示的最小尺寸:

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)
,则不会执行。

您的种子数组太小。获得如下所示的最小尺寸:

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)
,则它不会执行。

如果它给出segfault,则显示完整的代码。一切,包括
程序
结束程序
。看见重新编辑:当您尝试这样做时发生了什么?完整的代码只有1000行,涉及多个文件。我已经隔离了问题,并试图解释导致问题的位。如果它给出SEGFULT,请显示完整代码。一切,包括
程序
结束程序
。看见重新编辑:当您尝试这样做时发生了什么?完整的代码只有1000行,涉及多个文件。我已经隔离了问题,并试图解释导致问题的位。将其设置为seed为34或更高,允许它运行一次迭代,然后再次出现故障。我试着将它设置为400,它运行了5次迭代,4000次时只运行了1次迭代,然后是6次迭代。所以它似乎仍然在倾销核心。有什么办法可以预防吗?(这是在主机上调用并运行的子例程中)那么我认为您还有另一个问题。我刚刚用
seed(34)
运行了
调用随机数(RndNum)
并在单个随机数上循环了100000次。没有seg故障。您是否检查了版本的最小种子大小?我检查了种子大小,它也是34。我是应该
seed(1)=…
还是
seed=…
这样就分配了seed数组的所有元素?还是应该在do循环中单独为它们设定种子?这不会解决您的问题。我只设置了seed(1),正如您在我的代码中看到的,它工作得很好。在这一点上,我不认为核心转储来自随机数。你把它放在调试器里了吗?将它的种子设置为34或更多,允许它运行一次迭代,之后它会再次出错。我试着将它设置为400,它运行了5次迭代,4000次时只运行了1次迭代,然后是6次迭代。所以它似乎仍然在倾销核心。有什么办法可以预防吗?(这是在主机上调用并运行的子例程中)那么我认为您还有另一个问题。我刚刚用
seed(34)
运行了
调用随机数(RndNum)
并在单个随机数上循环了100000次。没有seg故障。您是否检查了版本的最小种子大小?我检查了种子大小,它也是34。我是应该
seed(1)=…
还是
seed=…
这样就分配了seed数组的所有元素?还是应该在do循环中单独为它们设定种子?这不会解决您的问题。我只设置了seed(1),正如您在我的代码中看到的,它工作得很好。在这一点上,我不认为核心转储来自随机数。你把它放在调试器里了吗?