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