gpt4 book ai didi

parallel-processing - OpenMP 在线程中调用子程序

转载 作者:行者123 更新时间:2023-12-04 08:03:58 25 4
gpt4 key购买 nike

我面临的问题概述如下:

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

我试图并行化一个序列,(并行化后看起来像上面写的那样)。我想要基本上执行两次相同的操作。所以理想情况下,我希望输出为

entered sub1
4
enterer sub2
9

但是输出是

entered sub2
0
entered sub1
923239424

我是并行编程的新手,(我的实际问题是我所概述的问题的更复杂版本)。谁能指出错误并提出改进建议。谢谢

最佳答案

OpenMP private 变量未赋予初始值,因此对 sub1sub2 的调用均使用 的随机值进行ij。您(可能)正在寻找的是 firstprivate 而不是:

!$omp parallel num_threads(2) shared(l,m) private(cr) firstprivate(i,j)
...
!$omp end parallel

firstprivate 使用主线程中相应变量在进入并行区域时的值初始化每个私有(private)副本。

顺便说一句,在 Fortran 90 及更高版本中使用 IF/GOTO/CONTINUE 实现 IF/THEN/ELSE/ENDIF 被许多人认为是一种糟糕的编程风格。您应该改用 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

关于parallel-processing - OpenMP 在线程中调用子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19088597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com