我今天早些时候正在阅读一本关于内存访问优化技术的教科书,例如展开和卡纸,本书提供了这个作为考虑的例子(在优化之前):
do i=1,N
do j=1,N
sum = sum + foo(A(i),B(j))
enddo
enddo
看着这个,立刻突然出现的是内存流量应该是N ^ 2。但是,代码后面的解释说明总内存流量实际上是N(N + 1)。那为什么会这样?
我的最佳猜测基本上是这样的:N(N + 1)= N ^ 2 + N.N ^ 2来自加载所有阵列B(其大小为N)总共N次(到期到外循环),N来自加载所有A(大小为N)正好一次(因为外循环运行完成一次)。
这是准确的吗?或者是否有一些东西可能会加载foo的签名,或者读取/写入变量sum
,或者其他偷偷摸摸的东西,我不考虑导致+1项?我知道这是一个相对简单的问题,但我想确保在解决更难的问题之前,我正在以正确的方式思考这类问题。