1

我目前正在尝试使用 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 或 Absoft 编译器。所以我的问题是以下任何一个或所有问题:为什么这不起作用?,我怎样才能让它工作?,或者我怎样才能避免使用这个结构来解决这个问题?任何帮助是极大的赞赏。

4

2 回答 2

2

这行不通,因为模式不是真正的字符串,我猜此时没有进行变量评估。我能想到的最好的事情是使用像 CoCo 或 C-Preprocessor 之类的预处理器来实现这一点。但是,或者,您可以使用运行时模式并使用环境变量 OMP_SCHEDULE 或 omp_set_schedule 例程来设置模式。

于 2011-08-21T00:27:26.840 回答
0

您指定的调度子句将对循环编译为机器代码的方式产生巨大影响。代码编译完成后,调度模式就被锁定了,无法在运行时更改。我同意 haraldkl,使用预处理器。

于 2011-08-21T01:25:44.307 回答