Sun Studio 12:Fortran 编程指南

10.3.1.2 循环中的子程序调用

循环(或从已调用例程内调用的任何子程序)中的子程序调用可能会导致产生数据依赖性,这种数据依赖性很容易被忽略,而不通过调用链深入分析数据和控制流。尽管最好是并行化执行大量工作的最外层循环,但这些循环往往正是涉及子程序调用的循环。

由于这种过程间的分析很困难并且会大大增加编译时间,所以自动并行化模式不会尝试这样做。对于显式并行化,编译器会为标有 PARALLEL DODOALL 指令的循环生成并行化代码,即使它包含子程序调用。确保此循环以及此循环包括的所有循环(包括被调用的子程序)中不存在任何数据依赖性仍是程序员的责任。

不同线程多次调用某个例程会造成问题,这些问题源自对互相干扰的局部静态变量的引用。使例程中的所有局部变量均为自动而不是静态可防止这种情况。此时,子程序的每次调用都会在栈中保留自己唯一的局部变量存储,任何两次调用均不会相互干扰。

AUTOMATIC 语句中列出子程序局部变量或用 -stackvar 选项编译子程序,通过这两种方法中的任一种,可以使子程序局部变量变为驻留在栈中的自动变量。但是,DATA 语句中初始化的局部变量必须进行改写,才能在实际赋值中进行初始化。


注 –

将局部变量分配给栈会造成栈溢出。有关如何增加栈大小的信息,请参见10.1.6 栈、栈大小和并行化