CSAPP 第三版 第六章 家庭作业
自己做的 仅供参考 可能出现错误
注:6.45 6.46 mark一下
6.22
假设磁道沿半径均匀分布,即总磁道数和(1-x)r成正比,则设磁道数为k(1-x)r;故2πkx(1-x)r2,从而x = 0.5时最大
6.23
Tavg seek = 4 ms
Tavg rotation = (1 / 2) * (1 / 15000 RPM) × (60s / 1min) = 2 ms
Tavg transfer = (1 / 15000 RPM) × (1 / 800) × (60s / 1/min) = 0.005 ms
T = Tavg seek + T avg rotation + T avg transfer = 6.005 ms
6.24
A. 22
B. 24000
6.25
高速缓存 | m | C | B | E | S | t | s | b |
---|---|---|---|---|---|---|---|---|
1. | 32 | 1024 | 4 | 4 | 64 | 24 | 6 | 2 |
2. | 32 | 1024 | 4 | 256 | 1 | 30 | 0 | 2 |
3. | 32 | 1024 | 8 | 1 | 128 | 22 | 7 | 3 |
4. | 32 | 1024 | 8 | 128 | 1 | 29 | 0 | 3 |
5. | 32 | 1024 | 32 | 1 | 32 | 22 | 5 | 5 |
6. | 32 | 1024 | 32 | 4 | 8 | 24 | 3 | 5 |
6.26
高速缓存 | m | C | B | E | S | t | s | b |
---|---|---|---|---|---|---|---|---|
1. | 32 | 2048 | 8 | 1 | 256 | 21 | 8 | 3 |
2. | 32 | 2048 | 4 | 4 | 128 | 23 | 7 | 2 |
3. | 32 | 1024 | 2 | 8 | 64 | 25 | 6 | 1 |
4. | 32 | 1024 | 32 | 2 | 16 | 23 | 4 | 5 |
6.27
A. 0x0704 0x0705 0x0706 0x0707
0x08A4 0x08A5 0x08A6 0x08A7
B. 0x1238 0x1239 0x123A 0x123B
6.28
A. 无
B. 0x18F0 0x18F1 0x18F2 0x18F3
0xB0 0xB1 0xB2 0xB3
C. 0x0E34 0x0E35 0x0E36 0x0E37
D. 0x1BDC 0x1BDD 0x1BDE 0x1BDF
6.29
A.
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
CT | CT | CT | CT | CT | CT | CT | CT | CI | CI | CO | CO |
B.
操作 | 地址 | 命中? | 读出的值(或者未知) |
---|---|---|---|
读 | 0x834 | 不命中 | 未知 |
写 | 0x836 | 命中 | 未知 |
读 | 0xFFD | 命中 | 0xC0 |
6.30
A. 128
B.
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
CT | CT | CT | CT | CT | CT | CT | CT | CI | CI | CI | CO | CO |
6.31
A.
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
B.
参数 | 值 |
---|---|
高速缓存块偏移(CO) | 0x02 |
高速缓存组索引(CI) | 0x06 |
高速缓存标记(CT) | 0x38 |
高速缓存命中?(是/否) | 否 |
返回的高速缓存字节 | 0x- |
6.32
A.
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 |
B.
参数 | 值 |
---|---|
高速缓存块偏移(CO) | 0x0 |
高速缓存组索引(CI) | 0x2 |
高速缓存标记(CT) | 0xB7 |
高速缓存命中?(是/否) | 否 |
返回的高速缓存字节 | 0x- |
6.33
0x16C8 0x16C9 0x16CA 0x16CB
0x1788 0x1789 0x178A 0x178B
6.34
dst数组
列0 | 列1 | 列2 | 列3 | |
---|---|---|---|---|
行0 | m | m | m | m |
行1 | m | m | m | m |
行2 | m | m | m | m |
行3 | m | m | m | m |
src数组
列0 | 列1 | 列2 | 列3 | |
---|---|---|---|---|
行0 | m | m | h | m |
行1 | m | h | m | h |
行2 | m | m | h | m |
行3 | m | h | m | h |
6.35
dst数组
列0 | 列1 | 列2 | 列3 | |
---|---|---|---|---|
行0 | m | h | h | h |
行1 | m | h | h | h |
行2 | m | h | h | h |
行3 | m | h | h | h |
src数组
列0 | 列1 | 列2 | 列3 | |
---|---|---|---|---|
行0 | m | h | h | h |
行1 | m | h | h | h |
行2 | m | h | h | h |
行3 | m | h | h | h |
6.36
A. 100%
B. 25%
C. 25%
D. 不会,冷不命中无法避免
E. 会,可以避免一些冲突不命中
6.37
函数 | N = 64 | N = 60 |
---|---|---|
sumA | 0.25 | 0.25 |
sumB | 1 | 0.25 |
sumC | 0.5 | 0.25 |
6.38
A. 1024
B. 128
C. 12.5%
6.39
A. 1024
B. 256
C. 25%
6.40
A. 1024
B. 256
C. 25%
6.41
25%
6.42
25%
6.43
100%
6.44
http://csapp.cs.cmu.edu/3e/students.html
为了辨识缓存的大小,选取中间的列(例如S8)来判断——避免CPU的prefetching带来干扰。可以看出,在32K和512K以及8M的地方有明显的落差,所以判断L1:32k、L2:256k、L3:8M。
6.45
3B2 < C
#define B chunkdatas_length_of_side
void faster_transpose(int *dst, int *src, int dim)
{
long limit = dim * dim;
for (int i = 0; i < dim; i += B)
{
for (int j = 0; j < dim; j += B)
{
/* Using blocking to improve temporal locality */
for (int k = i; k < i+B; ++k)
{
for (int l = j; l < j+B; ++l)
{
/* independent calculations */
int d = l*dim + k;
int s = k*dim + l;
if (s < limit && d < limit)
{
dst[d] = src[s]
}
}
}
}
}
}
乘法和加法已经实现了循环之间独立,src也是按照行读入的,但是dst却是按照列读入的,这样没有充分利用每一次读入的block。故可以采用blocking,即书上对矩阵乘法采用的方法。
6.46
#define B chunkdatas_length_of_side
void faster_col_convert(int *G, int dim)
{
long limit = dim * dim;
for (int i = 0; i < dim; i += B)
{
for (int j = i; j < dim; j += B)
{
/* Using blocking to improve temporal locality */
for (int k = i; k < i+B; ++k)
{
for (int l = j; l < j+B; ++l)
{
/* independent calculations */
int d = l*dim + k;
int s = k*dim + l;
if (s < limit && d < limit)
{
Bool temp = G[d] || G[s];
G[d] = temp;
G[s] = temp;
}
}
}
}
}
}