我有一个包含100多个子程序的程序,我试图让这段代码运行得更快,我正在尝试使用parallel flag编译这些子程序。我想知道如果我想使用并行标志,我需要在程序中定义哪些变量或参数。与没有并行标志的程序相比,仅使用并行优化标志增加了程序的运行时间。
非常感谢任何建议。非常感谢。
最诚挚的问候, Jdbaba
答案 0 :(得分:2)
我可以给你一些一般的指导,但是如果不知道你的特定编译器和平台/操作系统,我将无法专门为你提供帮助。据我所知,Fortran编译器中使用的所有自动并行化方案最终都使用OpenMP或MPI命令将循环拆分为线程或进程。问题是这些方案存在一定的开销。例如,在一个案例中,我有一个程序使用了一个优化库,该库由供应商提供为编译库而没有在其中进行优化。由于我的所有子例程和函数都在优化器的大循环之外或之内,并且由于只有对象数据,因此自动并行化器无法执行ipo,因此它无法使用多于一个核心。在这种情况下的运行时间,由于为OpenMP加载的DLL,/ qparallel实际上增加了〜10%的运行时间。
作为一个说明,自动并行化器并不神奇。基本上他们所做的只是自动向量化技术所做的事情,即寻找没有依赖于前一次迭代的数据的循环。如果它检测到迭代之间的变量发生了变化,或者编译器无法判断,那么它就不会尝试并行化循环。
如果您使用的是英特尔Fortran编译器,则可以打开诊断开关“/ qpar-report3”或“-par-report3”,为您提供有关循环依赖树的信息,以了解它们未能优化的原因。如果您无法访问正在使用的大部分代码,特别是具有主循环的部分,则代码中很可能没有太多机会使用自动并行程序。
在任何情况下,您总是可以尝试减少依赖关系并重新构造代码,使其对自动并行化更友好。