Fortran Coder

查看: 7727|回复: 7
打印 上一主题 下一主题

[并行] 关于利用OPENMP并行的一个问题

[复制链接]

8

帖子

2

主题

0

精华

入门

F 币
50 元
贡献
27 点
跳转到指定楼层
楼主
发表于 2020-4-21 22:08:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在并行计算中如果我想要在运行了50步时交换t1和t2的数值,在100步的时候交换t2和t3的数值,150步的时候交换t1和t2的数值,在200步的时候交换t2和t3的数值.依次类推,直到循环完为止。以下是代码
[Fortran] 纯文本查看 复制代码
program main
implicit none
real(kind=8) :: a,b,c,e0,e1,e2,t1,t2,t3,x,r1,r2,de,p
integer :: i
OPEN(31,FILE='Ea.CIR80',STATUS='unknown') 
OPEN(32,FILE='Eb.CIR80',STATUS='unknown')
OPEN(33,FILE='Gc.CIR80',STATUS='unknown')
t1 = 300.d0
t2 = 310.d0
t3 = 320.d0
e0 = 10000
call random_seed ()
!$OMP PARALLEL SECTIONS
!$OMP SECTION
do i = 1,10000
    call random_number (x)
    r1 = dble(x)
    r2 = dble(x) * 2
    e1 = t1 * e0
    e2 = e1 * r2
    de = e2 - e1
    if(de.le.0) then
        p = 1.d0
        else
            p = dexp(-de)
    end if
    if(p.le.r1) then
        e2 = e1
        else 
            e1 = e2
            write(*,*) i
            write(31,*) i,e2
    end if
end do
close(31)

!$OMP SECTION

do i = 1,10000
    call random_number (x)
    r1 = dble(x)
    r2 = dble(x) * 2
    e1 = t2 * e0
    e2 = e1 * r2
    de = e2 - e1
    if(de.le.0) then
        p = 1.d0
        else
            p = dexp(-de)
    end if
    if(p.le.r1) then
        e2 = e1
        else 
            e1 = e2
            write(*,*) '   ',i
            write(32,*) i,e2
    end if
end do
close(32)

!$OMP SECTION
do i = 1,10000
    call random_number (x)
    r1 = dble(x)
    r2 = dble(x) * 2
    e1 = t3 * e0
    e2 = e1 * r2
    de = e2 - e1
    if(de.le.0) then
        p = 1.d0
        else
            p = dexp(-de)
    end if
    if(p.le.r1) then
        e2 = e1
        else 
            e1 = e2
            write(*,*) '      ',i
            write(33,*) i,e2
    end if
end do
close(33)
!$OMP END PARALLEL SECTIONS
end program main


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

8

帖子

2

主题

0

精华

入门

F 币
50 元
贡献
27 点
沙发
 楼主| 发表于 2020-4-21 22:08:05 | 只看该作者
求大佬指点下迷津

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
板凳
发表于 2020-4-22 10:30:59 | 只看该作者
随机数子程序不能用于并行域,可能会出问题,三个部分得到相同的值。
[Fortran] 纯文本查看 复制代码
logical b
b=.false.
do i=1,10000
if(mod(i,50)==0) then
b=.not.b
if(b) then
交换t1,t2
else
交换t2,t3
end if
end if
end do

8

帖子

2

主题

0

精华

入门

F 币
50 元
贡献
27 点
地板
 楼主| 发表于 2020-4-22 12:19:56 | 只看该作者
li913 发表于 2020-4-22 10:30
随机数子程序不能用于并行域,可能会出问题,三个部分得到相同的值。[mw_shl_code=fortran,true]logical b
...

谢谢大佬的解答。
那如果我想在并行域产生随机数应该怎么做呢?

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
5#
发表于 2020-4-22 14:35:58 | 只看该作者
先生成随机数,再并行。

8

帖子

2

主题

0

精华

入门

F 币
50 元
贡献
27 点
6#
 楼主| 发表于 2020-4-22 21:08:19 | 只看该作者
li913 发表于 2020-4-22 14:35
先生成随机数,再并行。

谢谢大神。最后在问一下如果有t1,t2,t3,t4一共四个量,也按照50步依次交换的话该怎么写呢?

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
7#
发表于 2020-4-22 21:55:50 | 只看该作者
integer n
n=0
do i=1,10000
if(mod(i,50)==0) then
n=mod(n+1,3)
if(n==0) then
交换t1,t2
elseif(n==...)
交换...
end if
end if
end do

8

帖子

2

主题

0

精华

入门

F 币
50 元
贡献
27 点
8#
 楼主| 发表于 2020-4-23 21:10:51 | 只看该作者
li913 发表于 2020-4-22 21:55
integer n
n=0
do i=1,10000

哇,大佬牛B,这样就可以想加多少量就加多少了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-26 08:42

Powered by Tencent X3.4

© 2013-2024 Tencent

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