我最近发现在Fortran中使用纯函数和子例程。从Fortran手册中可以看出,似乎我的大部分子程序实际上都可以定义为纯(因为我总是指定所有参数的意图,通常我没有“保存”,“暂停”或外部I / O在我的大部分子程序中)。 我的问题是:我应该这样做吗?我想知道编译器是否优化了更好的纯子程序,或者它是否无关紧要,或者它是否会使事情变得更糟。 谢谢!
答案 0 :(得分:20)
您使用编译器来生成良好的代码,并且您为编译器提供的信息越多,您们两个人可以一起完成的工作就越好。
是否使用intent(in)
标记您不更改的任何伪参数,或使用parameter
作为常量,或明确地使pure
任何没有任何副作用的子程序,或者当你不关心计算循环的顺序时使用forall
,通过更清楚地了解你想要发生的事情,你会受益,因为:
在这三个好处中,优化可能不是最重要的;在纯子程序的情况下,智能编译器可能只能通过静态分析看到您的子程序没有副作用。尽管如此,您可以提供的保证越多,在保持正确性的同时优化代码的工作就越好。
答案 1 :(得分:5)
据我所知,它在顺序模式下无关紧要。但是,如果激活“自动并行化”选项,则编译器有时可以利用PURE声明来并行化包含对纯子例程的调用的循环(多线程)(如果子例程不纯,则不会冒风险)。 出于同样的原因,PURE声明对于想要手动设置//指令(例如OpenMP)的程序员也很有用,因为此类过程出现问题的风险相当有限。通常可以通过调用非纯子程序来并行化循环,但这需要深度验证...