实际上,我将这个数据局部性作为我的 fortran 程序运行速度有些慢的一个可能问题。在这个程序的一部分中,我有嵌套循环,并且在这些循环中,一个大数组的给定部分被多次引用。伪代码是这样的
subroutine foo()
use mymodule, only : big_array
...
do i = 1, n1
do j = 1, n2
! invoke big_array(i,j)
end
end
end subroutine
n1和的价值n2可以是数万。由于 big_array 是在堆上分配的(它是一个可分配的数组),我一直怀疑上述循环中对 big_array 元素的重复引用可能会导致程序变慢。但我一直无法明确对此表示怀疑,因为我对堆栈和堆内存的工作方式只有非常基本的了解。如果我要使用堆栈分配的数据,我可以在嵌套循环之前声明一个本地自动数组,并将 big_array 的所需部分存储在这个堆栈分配的本地数组中,以便新数组在内存中更接近嵌套循环,但这当程序需要分配本地数组时,还会产生额外的 cpu 时间。所以,我不知道哪个比哪个好。
有人还可以给我一个想法,如果程序涉及读取和写入距引用点足够远的内存地址,程序会变慢多少?