我有一些出于科学目的而编写的Fortran代码。有两个条件函数调用,它们被测试并按顺序运行。我希望并行调用这些函数,因为它们彼此无关。但是,我不确定最好的方法。
我拥有的代码示例如下:
...
if ( flag1 ) then
stat1 = func1( tm, dt, struct % a, struct % b )
if ( stat1 .gt. 0 ) then
call die_error("error message")
status = 1
return
end if
end if
if ( flag2 ) then
stat2 = func2( tm, dt, struct % a, struct % c )
if ( stat2 .gt. 0 ) then
call die_error("error message 2")
status = 1
return
end if
end if
...
标志flag1
和flag2
是用户定义的,它们之一可能为true,或者两者都可能为true,或者两者都可能为false,这就是为什么要对其进行独立测试的原因。
函数参数tm
和dt
分别是整数和双精度变量,但不会被func1
或func2
改变。
自定义数据类型struct
包含三个双精度数组:a
,b
和c
。 struct % a
或func1
不会更改数组func2
。但是,struct % b
被{1}更改,func1
被struct % c
更改了。
在特定情况下,当func2
和flag1
均为true时,可以并行调用flag2
和func1
。但是,我不确定以下情况:
func2
,因为它没有被代码更改;例如struct % a
?firstprivate(struct % a)
和flag1
都为真,如何正确执行条件,就像我只希望并行化一样?我的尝试如下:
flag2
我上面还有其他问题:
...
!$omp parallel num_threads(2) firstprivate(tm, dt, struct % a) if(flag1 .and. flag2)
!$omp master
!$omp task lastprivate(stat1)
stat1 = func1( tm, dt, struct % a, struct % b )
!$omp end task
!$omp task lastprivate(stat2)
stat2 = func2( tm, dt, struct % a, struct % c )
!$omp end task
!$omp taskwait
if ( (stat1 .gt. 0) .or. (stat2 .gt. 0) ) then
call die_error("error message")
status = 1
return
end if
!$omp end master
!$omp end parallel
if ( flag1 .and. .not.flag2 ) then
stat1 = func1( tm, dt, struct % a, struct % b )
if ( stat1 .gt. 0 ) then
call die_error("error message")
status = 1
return
end if
end if
if ( flag2 .and. .not.flag1 ) then
stat2 = func2( tm, dt, struct % a, struct % c )
if ( stat2 .gt. 0 ) then
call die_error("error message 2")
status = 1
return
end if
end if
...
指令?!$omp master
指令代替!$omp sections
?!$omp task
或!$omp parallel
失败,我从func1
指令返回是否安全?