for I := 1 to 1024 do
for J := 1 to 1024 do
A[J,I] := A[J,I] * B[I,J]
对于给定的代码,我想计算在磁盘和主内存之间传输的页数,给出以下假设:
我得到了解决方案,我的问题源于此:
A [J,I]:= A [J,I] * B [I,J]
writeA:= readA * readB
请注意,每次J循环和1次传输都会有2次传输 只会改变每个I循环。
1024 *(8 + 1024 *(1 + 1))= 2105344转移
因此,每次使用它时都会读取整行B,因此我们就是这样 将整行计为已转移(8页)。但是因为我们只读过 当我们转移它时,每个A行(1个值)的一部分,我们只抓1 每次页面。
所以我想弄清楚的是,我们如何在每次读取B时传输8个页面,但每次读取和写入A只能传输1个?
答案 0 :(得分:1)
我很惊讶你很困惑,因为我当然是。
部分混淆来自标记数组1:1024。我不能这么想,我把它们重新标记为0:1023。
我将“行主要顺序”表示A [0,0]与A [0,511]在同一磁盘块中。下一个块是A [0,512]到A [0,1023]。然后A [1,0]到A [1,511] ...和B的相同安排。
当内循环首次执行时,系统将获取包含A [0,0],然后是B [0,0]的块。随着J递增,引用的A的每个元素将来自单独的磁盘块。 A [1,0]与A [0,0]位于不同的块中。但只有每个引用的第512个B元素都来自不同的块; B [0,0]与B [0,511]在同一块中。因此,对于通过内循环,1024次计算的一次完整迭代,将有来自A的1024个块的取出,来自A的1024个脏块的写入,以及来自B的2个块的取出.2050整体访问。我不明白为什么你所说的答案会有来自B的8次提取。如果B没有在512字的边界上对齐,那么每个周期将有3次取自B;但不是8。
对于外循环中的每个I值,都会出现相同的模式。这使得2050 * 1024 = 2099200总块读取和写入,假设B是512字对齐。
我完全准备好让某人指出我明显的大器官 - 他们通常会这样做 - 但你给出的解释对我来说似乎不对。