内存存储结构
一、存储器分类
1、RAM随机存取存储器
RAM 掉电丢失
SRAM:快速 贵 cache
DRAM:相对慢 便宜 主存 帧缓冲区
2、ROM只读存储器
读:
CPU将地址A放在内存总线上。
主内存从内存总线中读取A,得到内容x,并将其放在总线上。
CPU从总线中读取单词x,并将其复制到寄存器%rax中。
写:
CPU将地址A放在总线上。主存储器读取它,并等待相应的数据字到达
CPU将数据字y放在总线上。
主存储器从总线中读取数据字y,并将其存储在地址A处
二、Disk Drive
1.组成
面 > 磁道> 扇区> 间隙
2.磁盘容量
记录密度 位/英寸
磁道密度 道/英寸
面密度 位/英寸^2
3.磁盘操作时间
访
问
时
间
=
寻
道
时
间
+
旋
转
时
间
+
传
送
时
间
访问时间=寻道时间+旋转时间+传送时间
访问时间=寻道时间+旋转时间+传送时间
三、局部性原则
空间局部性
时间局部性
四、高速缓存
将使用频率高的,以块的形式存储到cache中
命中(HIT)
不命中(MISS)
冷不命中:第k层是空的
**冲突不命中:**不空,但不是对应的
**容量不命中:**超缓存
五、cache结构与寻址
高速缓存组 set S
高速缓存行 line E
数据块 block B
cache size = S * E * B
中间位组索引
S=2^s | 组数 |
---|---|
E | 每个组的行数 |
B=2^b | 每个块多少字节 |
m=Log2(M) | 物理地址位数 |
C=B * S * E | 不包括有效位和标记位 |
1、直接映射高速缓存 E=1
每组只有1行
2. E路组相联高速缓存
不命中时的行替换:
LFU :最不长使用的,
LRU:最近最少使用
3.全相联高速缓存
只有一个组 地址中没有组索引
4.写
写命中: 直写:立即写回下一层(缺点是引起总线流量)
写回:当要被替换时再写回
写不命中:写分配:把下一层的块存到这一层
非写分配:直接把字写到低一层中
六、矩阵乘法
1.交换顺序
/* ijk */
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
sum = 0.0;
for (k=0; k<n; k++)
sum += a[i][k] * b[k][j];
c[i][j] = sum;
}
}
//不命中率
A:每四次有一次不命中
B:每次都不命中
C:很少当为0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txJQ54Vk-1650973980258)(C:/Users/86150/AppData/Roaming/Typora/typora-user-images/image-20220421170536180.png)]
/* kij */
for (k=0; k<n; k++) {
for (i=0; i<n; i++) {
r = a[i][k];
for (j=0; j<n; j++)
c[i][j] += r * b[k][j];
} }
并没有一次将c中的值算出来
//不命中率
A:0
B:每四次有一次不命中
C:每四次有一次不命中
/* jki */
for (j=0; j<n; j++) {
for (k=0; k<n; k++) {
r = b[k][j];
for (i=0; i<n; i++)
c[i][j] += a[i][k] * r; } }
//
A:1
B:0
C:1
2.分块
c = (double *) calloc(sizeof(double), n*n);
/* Multiply n x n matrices a and b */
void mmm(double *a, double *b, double *c, int n) {
int i, j, k;
for (i = 0; i < n; i+=B)
for (j = 0; j < n; j+=B)
for (k = 0; k < n; k+=B)
/* B x B mini matrix multiplications */
for (i1 = i; i1 < i+B; i++)
for (j1 = j; j1 < j+B; j++)
for (k1 = k; k1 < k+B; k++)
c[i1*n+j1] += a[i1*n + k1]*b[k1*n + j1];
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Cd03tvX-1650973980261)(C:/Users/86150/AppData/Roaming/Typora/typora-user-images/image-20220421171818534.png)]
不命中率:
每个block : 1/8 * B * B
一次迭代:一行 一列 :2* n/b *1/8 * B * B=nB/4
总共: (n/B)^2nB/4
)
for (k1 = k; k1 < k+B; k++)
c[i1n+j1] += a[i1*n + k1]b[k1n + j1];
}
[外链图片转存中...(img-1Cd03tvX-1650973980261)]
不命中率:
每个block : 1/8 * B * B
一次迭代:一行 一列 :2* n/b *1/8 * B * B=nB/4
总共: (n/B)^2*nB/4