Fortran Coder

查看: 2025|回复: 9
打印 上一主题 下一主题

[并行] 并行计算中随机数生成

[复制链接]

9

帖子

3

主题

0

精华

入门

F 币
36 元
贡献
14 点
跳转到指定楼层
楼主
发表于 2023-7-5 13:20:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
并行计算中如何循环生成不重复且随机度高的随机数
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

168

帖子

2

主题

1

精华

大师

Vim

F 币
1021 元
贡献
486 点

规矩勋章

沙发
发表于 2023-7-5 15:53:47 | 只看该作者
[Fortran] 纯文本查看 复制代码
call random_number(r)

如果每个进程要求不一样的话,可以在开头调用
[Fortran] 纯文本查看 复制代码
call random_seed(put=seed)

每个seed可以根据进程的编号自己设置

9

帖子

3

主题

0

精华

入门

F 币
36 元
贡献
14 点
板凳
 楼主| 发表于 2023-7-5 18:35:53 | 只看该作者
Transpose 发表于 2023-7-5 15:53
如果每个进程要求不一样的话,可以在开头 ...

我想根据线程来初始化种子,线程和进程一样吗

9

帖子

3

主题

0

精华

入门

F 币
36 元
贡献
14 点
地板
 楼主| 发表于 2023-7-5 18:49:27 | 只看该作者
Transpose 发表于 2023-7-5 15:53
如果每个进程要求不一样的话,可以在开头 ...
[Fortran] 纯文本查看 复制代码
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   

就是这段程序,需要怎么改进下,使得并行计算每次生产的随机数不一样

168

帖子

2

主题

1

精华

大师

Vim

F 币
1021 元
贡献
486 点

规矩勋章

5#
发表于 2023-7-6 09:28:02 | 只看该作者
不同线程的随机数是不一样的,你这个程序也是

9

帖子

3

主题

0

精华

入门

F 币
36 元
贡献
14 点
6#
 楼主| 发表于 2023-7-6 10:08:50 | 只看该作者
Transpose 发表于 2023-7-6 09:28
不同线程的随机数是不一样的,你这个程序也是

可是我运行了几次发现有的时候会出现几个相同的随机数,我觉得是因为并行时可能用到同一时间的种子,才出现这种情况,需要怎么改进呢?

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
7#
发表于 2023-7-6 19:00:55 | 只看该作者
随机数函数不能openmp并行。最好在一开始就生成随机数,或者加临界区串行调用。

9

帖子

3

主题

0

精华

入门

F 币
36 元
贡献
14 点
8#
 楼主| 发表于 2023-7-7 23:22:23 | 只看该作者
li913 发表于 2023-7-6 19:00
随机数函数不能openmp并行。最好在一开始就生成随机数,或者加临界区串行调用。 ...

由于我程序的结构是对do循环进行并行,然后都do循环里调用了一个函数,函数中需要调用随机函数生成随机数,这种情况下怎么用临界区来调用?

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
9#
发表于 2023-7-13 09:07:00 | 只看该作者
qwer 发表于 2023-7-7 23:22
由于我程序的结构是对do循环进行并行,然后都do循环里调用了一个函数,函数中需要调用随机函数生成随机数 ...

你看看视频 https://www.bilibili.com/video/BV1uA411v776?p=3

9

帖子

3

主题

0

精华

入门

F 币
36 元
贡献
14 点
10#
 楼主| 发表于 2023-7-25 10:34:46 | 只看该作者
li913 发表于 2023-7-13 09:07
你看看视频 https://www.bilibili.com/video/BV1uA411v776?p=3

好的,我看看
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 21:55

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表