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