Parallel processing Fortran中OpenMP指令的字符变量参数问题

Parallel processing Fortran中OpenMP指令的字符变量参数问题,parallel-processing,openmp,gfortran,fortran95,Parallel Processing,Openmp,Gfortran,Fortran95,我目前正在尝试使用OpenMP并行化一些用Fortran编写的多重网格代码,我发现OpenMP调度子句对性能有巨大影响。回想一下,OpenMP调度子句是静态、动态、运行时和引导的,它们决定了循环中的工作如何在线程之间分配。例如,带有调度子句的OpenMP并行SAXPY循环如下所示: !$OMP Parallel Do Schedule(Static) Do i=1,n z(i)=a*x(i)+y(i) End Do !$OMP End Parallel Do 现在假设我们在一段代码中

我目前正在尝试使用OpenMP并行化一些用Fortran编写的多重网格代码,我发现OpenMP调度子句对性能有巨大影响。回想一下,OpenMP调度子句是静态、动态、运行时和引导的,它们决定了循环中的工作如何在线程之间分配。例如,带有调度子句的OpenMP并行SAXPY循环如下所示:

!$OMP Parallel Do Schedule(Static)
Do i=1,n
    z(i)=a*x(i)+y(i)
End Do 
!$OMP End Parallel Do
现在假设我们在一段代码中有许多并行循环,并且无法事先确定这些调度子句中的哪一个将使程序运行得最快。手工更改每个计划条款都会让人头疼,所以我想我会这么做:

Character(Len=10)::sched="Dynamic"

!$OMP Parallel Do Schedule(sched)
Do i=1,n
    z(i)=a*x(i)+y(i)
End Do
!$OMP End Parallel Do

然后我可以简单地把字符变量'sched'放在每个并行循环中,一次改变它们,比如说,放sched=“Static”,然后做一个运行时测试,看看哪一个运行得最快!当然,它不起作用,至少gfortran或Absolft编译器不起作用。所以我的问题是:为什么这个不起作用?我怎样才能让它起作用?或者我怎样才能避免使用这个结构来解决这个问题?非常感谢您的帮助。

这不起作用,因为模式不是真正的字符串,我想在这一点上没有进行变量计算。我能想到的最好的办法就是使用CoCo或C预处理器这样的预处理器来实现这一点。
但是,您也可以使用运行时模式,并使用环境变量OMP_SCHEDULE或OMP_set_SCHEDULE例程来设置模式。

您指定的调度子句将对循环编译为机器代码的方式产生显著影响。一旦代码被编译,调度模式将被锁定,并且无法在运行时更改。我同意haraldkl,使用预处理器。

啊,谢谢!我使用了omp_set_时间表例程,它像冠军一样工作!gfortran 6不支持这个例程,但是Absolft编译器支持,gfortran 7——我还没有声明它支持这个例程。但无论如何,在我看来,这是一个已解决的问题。非常感谢你的帮助。