如果OpenMP打开MP:... else

时间:2014-01-14 20:14:38

标签: fortran openmp fortran90

问题: 我有一些代码,我自己和其他几个人一直在编写代码,我使用了代码并使用了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 ++相同)

2 个答案:

答案 0 :(得分:4)

确切的问题:

!$ 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

答案 1 :(得分: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条件编译sentinel设置变量:

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