【发布时间】:2016-03-09 20:19:11
【问题描述】:
我有一个 Fortran90 程序 (Packmol),在此之前,它是通过静态内存分配实现的。
我更改了代码以使用动态分配,这样所有数组都在开始时分配。在某些示例中,我的性能损失为 400%。
然后,我验证了即使数组的大小与我使用静态分配时的大小相同,问题仍然存在。也就是说,如果我将分配从
类似于
double precision :: x(1000)
这足以导致性能损失。当然,当所有需要动态分配的数组都这样做时,大约是 30。double precision, allocatable :: x(:)
allocate(x(1000))
有没有办法以更有效的方式分配数组以减少性能损失?还是有人有不同的建议?
非常感谢。
编辑:不知何故,问题解决了。动态版本现在只比预期的静态版本慢一点。我真的不知道是什么导致了之前的大幅放缓。
【问题讨论】:
-
好吧,我没有放代码,因为它是一个大程序。代码可在此处获得:github.com/leandromartinez98/packmol。在子例程 setsizes.f90 中有一个分支,其中所有数组都是动态分配的。
-
该例程是否经常调用?调用之间分配的大小会改变吗? (或者它们是为整个程序运行而设置的。)
allocate-ing 本身的成本并没有那么高。这取决于它的使用方式。 -
如您所见,很可能有人会通过这样的链接。即使是现在的答案也只是猜测。您应该准备一个重现问题的最小示例找到差异较大的子程序并进行操作。
-
分析您的代码 - 在更改为可分配数组之前和之后。确保您正在测试的构建启用了适当的优化级别,并且没有启用运行时调试选项,例如数组边界检查。
-
请注意,代码不符合要求。在解决这个问题之前,思考这个问题没有什么意义 - 变化可能仅仅是由于内存损坏或类似情况而选择了不同的执行路径。