use*_*327 2 parallel-processing fortran openmp
我面临的问题如下所述:
module k
integer :: l,m
end module k
program p4
use k
integer :: i,j,omp_get_thread_num,cr
i = 2
j = 3
!$omp parallel num_threads(2) shared(l,m) private(i,j,cr)
cr = omp_get_thread_num()
if (cr == 0) goto 1111
call sub1(i)
write(*,*) l
goto 2222
1111 call sub2(j)
write(*,*) m
2222 continue
!$omp end parallel
end program p4
subroutine sub1(a)
use k
integer :: a
l = a**2
write(*,*) 'entered sub1'
end subroutine sub1
subroutine sub2(b)
use k
integer :: b
m = b**2
write(*,*) 'entered sub2'
end subroutine sub2
Run Code Online (Sandbox Code Playgroud)
我试图并行化一个序列,(在并行化之后看起来如上所述).我想要执行两次相同的操作.所以理想情况下,我希望输出
entered sub1
4
enterer sub2
9
Run Code Online (Sandbox Code Playgroud)
但输出是
entered sub2
0
entered sub1
923239424
Run Code Online (Sandbox Code Playgroud)
我是并行编程的新手,(我的实际问题是我概述的一个更复杂的版本).任何人都可以指出错误并建议改进.谢谢
OpenMP的private变量不是给定的初始值,因此这两个调用sub1和sub2使用的随机值是由i和j.您(可能)正在寻找的是firstprivate:
!$omp parallel num_threads(2) shared(l,m) private(cr) firstprivate(i,j)
...
!$omp end parallel
Run Code Online (Sandbox Code Playgroud)
firstprivate 使用主线程中相应变量进入并行区域时的值初始化每个私有副本.
顺便说一句,实现IF/THEN/ELSE/ENDIF与IF/GOTO/CONTINUEFortran 90中,后来被很多不好的编程风格考虑.您应该使用OpenMP部分:
!$omp parallel sections num_threads(2) shared(l,m) private(cr) firstprivate(i,j)
!$omp section
call sub1(i)
write(*,*) l
!$omp section
call sub2(j)
write(*,*) m
!$omp end parallel sections
Run Code Online (Sandbox Code Playgroud)