?X+Y=+0.01010
[X]补 11.10001 + [-Y]补 11.00111 [X-Y]补 10.11000
因为符号位相异,所以结果发生溢出。
3 pc=14位 IR=18位 AC0=AC1=16位 R0-R3=16位 IAR=14位 IDR=18位 DAR=16位 DDR=16位
4 (1)主存容量256MB,按字节寻址的地址位数应为28位,数据Cache分为8行(用3位地址),每行64B(用6位地址),因此Cache中每个字块的Tag字段的位数应是28-9=19位,还要使用一个有效位,二者合计为20位;因此数据Cache的总容量应为:64B×8+(20/8×8)B = 532B。
(2)数组A[0][31]所在的主存块对应的Cache行号是: (320+31×4)div 64 = 6,
数组A[1][1]所在主存块对应的Cache行号: ((320+256×4+ 1×4) div 64) mod 8 = 5。
所以 a[0][31]所在主存块映射到Cache第6行, a[1][1]所在主存块映射到Cache第5行。
(3)编译时i, j, sum均分配在寄存器中,故数据访问命中率仅考虑数组a的情况。 ①这个程序的特点是数组中的每一个int 类型的数据只被使用一次。数组A按行优先存放,数据Cache正好放下数组半行中的全部数据,即数据的存储顺序与使用次序有更高的吻合度,每个字块存16个int类型的数据,访问每个字块中头一个字不会命中,但接下来的15个字都会命中,访问全部字块都符合这一规律,命中率是15/16,即程序A的数据访问命中率为93.75%;
②程而程序B是按照数组的列执行外层循环,在内层循环过程中,将连续访问不同行的同一列的数据,不同行的同一列数据使用的是同一个Cache单元,每次都不会命中,命中率是0,程序执行特别慢。
根据上述计算出的命中率,得出程序B每次取数都要访问主存,所以程序A的执 行比程序B快得多。
5
1024K*16?2*4?8
512K*4