并行计算中随机数生成
并行计算中如何循环生成不重复且随机度高的随机数call random_number(r)
如果每个进程要求不一样的话,可以在开头调用
call random_seed(put=seed)
每个seed可以根据进程的编号自己设置
Transpose 发表于 2023-7-5 15:53
如果每个进程要求不一样的话,可以在开头 ...
我想根据线程来初始化种子,线程和进程一样吗
Transpose 发表于 2023-7-5 15:53
如果每个进程要求不一样的话,可以在开头 ...module Random_Mod
Implicit None
! ran return a uniform random number between 0-1
! norma return a normal distribution
contains
function ran() !returns random number between 0 - 1
implicit none
integer , save :: flag = 0
double precision :: ran
if(flag==0) then
call random_seed()
flag = 1
endif
call random_number(ran) ! built in fortran 90 random number function
end function ran
function normal(mean,sigma)
implicit none
integer :: flag
double precision, parameter :: pi = 3.141592653589793239
double precision :: u1, u2, y1, y2, normal, mean, sigma
save flag
data flag /0/
u1 = ran(); u2 = ran()
if (flag.eq.0) then
y1 = sqrt(-2.0d0*log(u1))*cos(2.0d0*pi*u2)
normal = mean + sigma*y1
flag = 1
else
y2 = sqrt(-2.0d0*log(u1))*sin(2.0d0*pi*u2)
normal = mean + sigma*y2
flag = 0
endif
end function normal
end module Random_Mod
program main
use Random_Mod
use omp_lib
implicit none
integer::i
!real(kind=8)::numit
!$omp parallel private(i)
!$omp do
do i = 1,10
write(*,*)ran()
end do
!$omp end do
!$omp end parallel
end program
就是这段程序,需要怎么改进下,使得并行计算每次生产的随机数不一样 不同线程的随机数是不一样的,你这个程序也是 Transpose 发表于 2023-7-6 09:28
不同线程的随机数是不一样的,你这个程序也是
可是我运行了几次发现有的时候会出现几个相同的随机数,我觉得是因为并行时可能用到同一时间的种子,才出现这种情况,需要怎么改进呢?
随机数函数不能openmp并行。最好在一开始就生成随机数,或者加临界区串行调用。 li913 发表于 2023-7-6 19:00
随机数函数不能openmp并行。最好在一开始就生成随机数,或者加临界区串行调用。 ...
由于我程序的结构是对do循环进行并行,然后都do循环里调用了一个函数,函数中需要调用随机函数生成随机数,这种情况下怎么用临界区来调用?
qwer 发表于 2023-7-7 23:22
由于我程序的结构是对do循环进行并行,然后都do循环里调用了一个函数,函数中需要调用随机函数生成随机数 ...
你看看视频 https://www.bilibili.com/video/BV1uA411v776?p=3 li913 发表于 2023-7-13 09:07
你看看视频 https://www.bilibili.com/video/BV1uA411v776?p=3
好的,我看看
页:
[1]