0

我有一个包含 100 多个子例程的程序,我正在尝试使此代码运行得更快,并且我正在尝试使用并行标志编译这些子例程。我想知道如果我想使用并行标志,我需要在程序中定义哪些变量或参数。与没有并行标志的程序相比,仅使用并行优化标志增加了我的程序的运行时间。

任何建议都非常感谢。非常感谢。

最好的问候, 贾巴巴

4

1 回答 1

2

我可以为您提供一些一般性指导,但在不了解您的特定编译器和平台/操作系统的情况下,我将无法具体为您提供帮助。据我所知,Fortran 编译器中使用的所有自动并行化方案最终都使用 OpenMP 或 MPI 命令将循环拆分为线程或进程。问题是这些方案有一定的开销。例如,在一个案例中,我有一个程序使用供应商提供的优化库作为编译库,其中没有优化。由于我的所有子例程和函数都在优化器的大循环之外或之内,并且由于只有对象数据,因此自动并行器无法执行 ipo,因此它无法使用多个核心。

需要注意的是,自动并行器并不神奇。本质上,他们所做的一切与自动向量化技术所做的事情相同,即寻找没有依赖于先前迭代的数据的循环。如果它检测到变量在迭代之间发生了变化,或者编译器无法判断,那么它就不会尝试并行化循环。

如果您使用的是英特尔 Fortran 编译器,您可以打开诊断开关“/qpar-report3”或“-par-report3”,为您提供有关循环依赖树的信息,以了解它们未能优化的原因。如果您无法访问正在使用的大部分代码,尤其是具有主要循环的部分,那么您的代码很可能不会有太多机会使用自动并行器。

在任何情况下,您都可以尝试减少依赖关系并重新编写代码,使其对自动并行化更加友好。

于 2013-02-04T19:40:46.643 回答