如果OpenMP可用,则使用OpenMP:否则

3
问题: 我和其他几个人写了一些代码,我将其改为使用mpi和openmp,效果非常好(我在Blue Gene/Q上运行它有很大帮助)。 但是,现在我不想使用 -openmp 指令编译代码,因为我使用了约简变量来获得加速效果。
示例:
!$OMP parallel do schedule(DYNAMIC, 4) reduction(min:min_val)
....
    min_val = some_expression(i)
....
!$OMP end parallel do
result = sqrt(min_val)

我正在寻找类似于以下内容的信息:

!$OMP if OMP:
!$OMP min_val = some_expression(i)
!$OMP else:
if ( min_val .gt. some_expression(i) ) min_val = some_expression(i)
!$OMP end else

有人知道类似的东西吗?请注意,如果没有使用-openmp参数,将会忽略!$OMP行,并且代码将正常运行并得到正确的答案。

谢谢,

(是的,这是Fortran代码,但它几乎与C和C++相同)


我仍然不会使用C和C++标签,因为你会从openmp标签中得到那些人。 - Vladimir F Героям слава
1
关于标签的问题,在C和C++中使用普通的预处理器和'_Pragma'有一个微不足道的解决方案。我不确定Fortran是否存在类似的解决方案。 - Konrad Rudolph
@KonradRudolph 这是一种常见的做法,使用预处理的FORTRAN源文件(通常它们的扩展名以大写字母“F”开头而不是小写字母)。因此,解决方案可能与C语言中一样简单。 - Massimiliano
@Massimiliano 我并不怀疑这一点,我只是想说,除非Fortran有一个与C概念非常相似的预处理器,否则解决方案可能不可转移,并且[tag:c]和[tag:c ++]标签因此无用。 - Konrad Rudolph
2个回答

6
针对您的具体问题:
!$ whatever_statement

只有在使用OpenMP编译时才会使用该语句。
否则,在您的特定情况下,您是否可以只使用以下语句:
!$OMP parallel do schedule(DYNAMIC, 4) reduction(min:min_val)
....
    min_val = min(min_val, some_expression(i))
....
!$OMP end parallel do

result = sqrt(min_val)

我经常使用这个命令,有时候会带上 -openmp 参数,有时候则不需要。


啊,这回答了我一个关于仅在OpenMP编译的程序中运行代码的问题的部分。但仍然对在更一般的情况下不运行“默认”行为感到好奇。(是的,您的答案确实很好地回答了这个特定情况) - ShaBANG

4

如果你愿意使用预处理的FORTRAN源文件,当使用OpenMP时,你总是可以依赖于宏_OPENMP的定义。最简单的例子如下:

program pippo

#ifdef _OPENMP
print *, "OpenMP program"
#else
print *, "Non-OpenMP program"
#endif

end program pippo

编译使用的:

gfortran -fopenmp main.F90

该程序将给出以下输出:
OpenMP program

如果您不想使用预处理的源文件,则可以使用FORTRAN条件编译哨兵设置变量:

program pippo

  implicit none

  logical :: use_openmp = .false.

  !$ use_openmp = .true.
  !$ print *, "OpenMP program"
  if( .not. use_openmp) then
     print *, "Non-OpenMP program"
  end if

end program pippo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接