Skip to content
This repository was archived by the owner on Apr 7, 2026. It is now read-only.

Commit 5176c8d

Browse files
committed
lab4-upd
1 parent b75572b commit 5176c8d

1 file changed

Lines changed: 31 additions & 27 deletions

File tree

docs/lab/lab4.md

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ hits:8 misses:1 evictions:0
9090
>
9191
> **需求:**
9292
>
93-
> 1. 你的代码在编译时不能存在warning
94-
> 2. 你只能使用 **c语言** 来实现
95-
> 3. 虽然给了测试数据,但不允许面向数据编程,助教会做源码检查;不允许通过直接调用`csim-ref`来实现
93+
> 1. 你的代码在编译时不能存在warning
94+
> 2. 你只能使用 **c语言** 来实现
95+
> 3. 虽然给了测试数据,但不允许面向数据编程,助教会做源码检查;不允许通过直接调用`csim-ref`来实现
9696
9797
每次修改你的代码,在进行测试前先编译:
9898

@@ -129,7 +129,7 @@ $ ./csim -s 5 -E 1 -b 5 -t traces/long.trace
129129

130130
cache为何被称为“高速缓存”,是因为读取cache的速率远快于读取主存的速率(可能大概100倍),因此cache miss的次数往往决定了程序的运行速度。因此,我们需要尽可能设计cache-friendly的程序,使得cache miss的次数尽可能少。
131131

132-
在这部分的实验,你将对矩阵转置程序(一个非常容易cache miss的程序)进行优化,让cache miss的次数尽可能少。你的分数将由cache miss的次数决定
132+
在这部分的实验,你将对矩阵转置程序(一个非常容易cache miss的程序)进行优化,让cache miss的次数尽可能少。你的分数将由cache miss的次数决定
133133

134134
> [!NOTE]
135135
>
@@ -152,9 +152,9 @@ void trans(int M, int N, int A[N][M], int B[M][N])
152152
registerTransFunction(trans, trans_desc);
153153
```
154154

155-
我们提供了一个名为`trans()`的函数作为示例
155+
我们提供了一个名为`trans()`的函数作为示例
156156

157-
你需要保证有一个且有唯一一个“注册”的函数用于最终提交,我们将靠“注册”时的description进行区分,请确保你的提交函数的description是“Transpose submission” ,比如
157+
你需要保证有一个且有唯一一个“注册”的函数用于最终提交,我们将靠“注册”时的description进行区分,请确保你的提交函数的description是“Transpose submission” ,比如
158158

159159
```c
160160
char transpose_submit_desc[] = "Transpose submission";
@@ -164,23 +164,27 @@ void transpose_submit(int M, int N, int A[N][M], int B[M][N])
164164
}
165165
```
166166
167-
我们将使用特定形状的矩阵和特定参数的cache来进行评测,所以你 **可以** 针对这些特殊情况来编写代码
167+
我们将使用特定形状的矩阵和特定参数的cache来进行评测,所以你 **可以** 针对这些特殊情况来编写代码
168168
169169
**要求**:
170170
171-
- 你的代码在编译时不能存在warning
172-
- 在每个矩阵转置函数中,你至多能定义12个int类型的局部变量(不包括循环变量,但你不能将循环变量用作其他用途),且不能使用任何全局变量。你不能定义除int以外类型的变量。你不能使用malloc等方式申请内存块。你可以使用int数组,但等同于数组大小的数量的int类型变量也同样被计入
173-
- 你不能使用递归
174-
- 你只允许使用一个函数完成矩阵转置的功能,而不能在函数中调用任何辅助函数
175-
- 你不能修改原始的矩阵A,但是你可以任意修改矩阵B
176-
- 你可以定义宏
171+
- 你的代码在编译时不能存在warning
172+
- 在每个矩阵转置函数中,你至多能定义12个int类型的局部变量(不包括循环变量,但你不能将循环变量用作其他用途),且不能使用任何全局变量。你不能定义除int以外类型的变量。你不能使用malloc等方式申请内存块。你可以使用int数组,但等同于数组大小的数量的int类型变量也同样被计入
173+
- 你不能使用递归
174+
- 你只允许使用一个函数完成矩阵转置的功能,而不能在函数中调用任何辅助函数
175+
- 你不能修改原始的矩阵A,但是你可以任意修改矩阵B
176+
- 你可以定义宏
177177
178178
**评分**:
179179
180-
我们将使用cache参数为:`s = 48, E = 1, b = 48`
181-
我们将使用以下3种矩阵来进行评测 - 48 * 48的矩阵,分值`12`分,miss次数`< 500`则满分,miss次数`> 800`则0分,`500~800`将按miss次数获取一定比例的分数 - 96 * 96的矩阵,分值`12`分,miss次数`< 2200`则满分,miss次数`> 3000`则0分,`2200~3000`将按miss次数获取一定比例的分数 - 93 * 99的矩阵,分值`12`分,miss次数`< 3000`则满分,miss次数`> 4000`则0分,`3000~4000`将按miss次数获取一定比例的分数 - 荣誉分`4`分,将在荣誉部分介绍
180+
我们将使用cache参数为:`S = 48, E = 1, B = 48`
181+
我们将使用以下3种矩阵来进行评测
182182
183-
我们只会针对这三种矩阵进行测试,所以你 **可以** 只考虑这三种情况
183+
- 48 * 48的矩阵,分值`12`分,miss次数`< 500`则满分,miss次数`> 800`则0分,`500~800`将按miss次数获取一定比例的分数。
184+
- 96 * 96的矩阵,分值`12`分,miss次数`< 2200`则满分,miss次数`> 3000`则0分,`2200~3000`将按miss次数获取一定比例的分数。
185+
- 93 * 99的矩阵,分值`12`分,miss次数`< 3000`则满分,miss次数`> 4000`则0分,`3000~4000`将按miss次数获取一定比例的分数。
186+
187+
我们只会针对这三种矩阵进行测试,所以你 **可以** 只考虑这三种情况。
184188
185189
#### step 0
186190
@@ -190,19 +194,19 @@ make clean && make
190194

191195
#### step 1
192196

193-
在测试之前,进行算法正确性的测试
197+
在测试之前,进行算法正确性的测试
194198

195199
```bash
196200
./tracegen -M <row> -N <col>
197201
```
198202

199-
比如对48 * 48转置函数进行测试
203+
比如对48 * 48转置函数进行测试
200204

201205
```bash
202206
./tracegen -M 48 -N 48
203207
```
204208

205-
你也可以对特定的函数进行测试,比如对第0个“注册”的函数
209+
你也可以对特定的函数进行测试,比如对第0个“注册”的函数
206210

207211
```bash
208212
./tracegen -M 48 -N 48 -F 0
@@ -214,20 +218,20 @@ make clean && make
214218
./test-trans -M <row> -N <col>
215219
```
216220

217-
这个程序将使用valgrind工具生成trace文件,然后调用csim-ref程序获取cache命中、缺失、替换的次数
221+
这个程序将使用valgrind工具生成trace文件,然后调用csim-ref程序获取cache命中、缺失、替换的次数
218222

219223
### hints
220224

221-
- 在调用`./test-trans`之后,可以使用如下命令查看你的cache命中/缺失情况;你可以把`f0`替换为`fi`来查看第 i 个“注册”的函数带来的cache命中/缺失情况
225+
- 在调用`./test-trans`之后,可以使用如下命令查看你的cache命中/缺失情况;你可以把`f0`替换为`fi`来查看第 i 个“注册”的函数带来的cache命中/缺失情况
222226

223227
```bash
224-
./csim-ref -v -s 48 -E 1 -b 48 -t trace.f0 > result.txt
228+
./csim-ref -v -S 48 -E 1 -B 48 -t trace.f0 > result.txt
225229
```
226230

227231
- [这篇文章可能对你有所启发](http://csapp.cs.cmu.edu/public/waside/waside-blocking.pdf)
228-
- 你可能要考虑冲突带来的miss
229-
- 脑测一下你的miss次数或许是一个很好的选择,你可以计算一下大概有多少比例的miss,然后乘以总的读写次数;你可以在上面生成的`result.txt`文件中验证你的想法
230-
- 你可以认为A和B矩阵的起始地址位于某个cacheline的开始(即A和B二维数组的起始地址能被48整除)
232+
- 你可能要考虑冲突带来的miss
233+
- 脑测一下你的miss次数或许是一个很好的选择,你可以计算一下大概有多少比例的miss,然后乘以总的读写次数;你可以在上面生成的`result.txt`文件中验证你的想法
234+
- 你可以认为A和B矩阵的起始地址位于某个cacheline的开始(即A和B二维数组的起始地址能被48整除)
231235

232236
### 矩阵转置优化 Plus
233237

@@ -303,8 +307,8 @@ $C_{ij} = \sum_{k} A_{ik} \times B_{kj}$
303307
>
304308
> 需求(同Part B):
305309
>
306-
> 1. 最多定义 **16 个 int 类型**的局部变量(循环变量不计入,但不能将循环变量用作其他用途)
307-
> 2. 不能修改矩阵 A 和 B,但可以任意修改矩阵C
310+
> 1. 最多定义 **16 个 int 类型**的局部变量(循环变量不计入,但不能将循环变量用作其他用途)
311+
> 2. 不能修改矩阵 A 和 B,但可以任意修改矩阵C
308312
309313
#### 测试方法
310314

0 commit comments

Comments
 (0)