Fortran:openmp笔记23

!.. critical指令
!.. critical语法
!.. !$omp critical
!..   code
!.. $omp end critical
!.. 使用critical的注意事项:
!.. 1. 在同一时间内,只允许一个线程执行critical结构,其他线程必须排队依次执行critical结构
!.. 2. critical指令不允许相互嵌套
!.. 3. critical结构不允许跳转。即跳转出critical或跳转入critical结构
Program critical_max
  use omp_lib
  implicit none 
  integer, parameter :: m = 10
  integer :: i, pmax, px
  integer :: tid, nthreads
  integer :: p(m)

  call omp_set_num_threads(3)
  do i = 1, m
    p(i) = i 
  end do 

  px = 0
  !$omp parallel private( pmax, i, tid, nthreads ) shared( p, px )
  pmax = 0
  !$omp do 
  do i = 1, m
    pmax = max( pmax,p(i) )
  end do
  !$omp end do nowait

  !$omp critical
  nthreads = omp_get_num_threads()
  tid      = omp_get_thread_num()
  write( *,'(1x,a,g0,3x,g0)' ) "number of threads, id = ", nthreads, tid
  write( *,'(1x,a,g0,3x,g0)' ) "pmax, px = ", pmax, px
  px = max( px, pmax )
  !$omp end critical

  !$omp end parallel
  write( *,'(1x,a,g0)' ) "max(p) = ", px

End program critical_max

!.. 总结
!.. 1. 进入并行区域时,3个子线程各自拥有变量pmax的副本
!.. 2. px时共享变量,如果3个子线程拥有的变量pmax的副本同时与px比较后将最大值写入
!..    就会出现数据竞争现象。
!..    因此,建立一个临界块,使每个线程排队执行临界块,从而实现各线程逐个与px求最大值后将结果写入共享变量px
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值