【发布时间】:2015-01-30 17:32:21
【问题描述】:
我最近将我的 .f90 代码更新为 .f03,我期待看到加速,因为我的旧版本在 do 循环内的每次迭代中都涉及许多分配和取消分配(7 个 3D 数组--45x45x45)(总共 4000 个) .使用派生类型,我在模拟开始时分配这些数组并在结束时释放它们。我以为我会看到加速,但实际上运行速度要慢得多(30 分钟而不是 23 分钟)。
我运行了一个分析器,看起来加/减/乘/除运算符需要相对较长的时间。除了标准变化的变化,据我所知,运营商是唯一的区别。我想知道这是否是因为函数在每次操作期间都会返回字段数量的新副本。
所以这是我的问题:如果我将函数更改为子例程以便这些字段通过引用传递(我认为?),它会运行得更快吗?此外,如果这更快,更可取,那么为什么所有这些示例都显示用于运算符重载的函数而不是使用子例程?我觉得我错过了什么。
操作符重载的函数参考:
http://www.mathcs.emory.edu/~cheung/Courses/561/Syllabus/6-Fortran/operators.html
http://research.physics.illinois.edu/ElectronicStructure/498-s97/comp_info/overload.html
https://web.stanford.edu/class/me200c/tutorial_90/13_extra.html
这是我的一个运营商的例子:
function vectorVectorDivide(f,g) result(q)
implicit none
type(vectorField),intent(in) :: f,g
type(vectorField) :: q
q%x = f%x / g%x; q%y = f%y / g%y; q%z = f%z / g%z
q%sx = f%sx; q%sy = f%sy; q%sz = f%sz
end function
非常感谢您提供任何帮助或信息!
【问题讨论】:
-
是的,可分配数组
标签: function fortran operator-overloading gfortran subroutine