使用 PGI Fortran 生成许多随机数时出现分段错误
Segmentation fault when generating many random numbers using PGI Fortran
我需要生成大量随机数(从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) 上阅读 post。我决定先生成所有的数字,然后把它们放在一个数组中。
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
但这也给出了段错误。
您的种子数组太小。像这样获取最小尺寸:
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)
,它不会。
我需要生成大量随机数(从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) 上阅读 post。我决定先生成所有的数字,然后把它们放在一个数组中。
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
但这也给出了段错误。
您的种子数组太小。像这样获取最小尺寸:
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)
,它不会。