OpenMP并行函数调用

时间:2019-07-03 16:55:50

标签: fortran openmp

我有一些出于科学目的而编写的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

...

标志flag1flag2是用户定义的,它们之一可能为true,或者两者都可能为true,或者两者都可能为false,这就是为什么要对其进行独立测试的原因。

函数参数tmdt分别是整数和双精度变量,但不会被func1func2改变。

自定义数据类型struct包含三个双精度数组:abcstruct % afunc1不会更改数组func2。但是,struct % b func1 struct % c更改了。

在特定情况下,当func2flag1均为true时,可以并行调用flag2func1。但是,我不确定以下情况:

  1. 如何正确处理自定义数据类型;例如,我需要锁吗?
  2. 如何正确处理func2,因为它没有被代码更改;例如struct % a
  3. 如果firstprivate(struct % a)flag1都为真,如何正确执行条件,就像我只希望并行化一样?

我的尝试如下:

flag2

我上面还有其他问题:

  1. 是否需要... !$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 ... 指令?
  2. 是否应使用!$omp master指令代替!$omp sections
  3. 如果!$omp task!$omp parallel失败,我从func1指令返回是否安全?

0 个答案:

没有答案