@@ -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
130130cache为何被称为“高速缓存”,是因为读取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])
152152registerTransFunction(trans, trans_desc);
153153```
154154
155- 我们提供了一个名为` trans() ` 的函数作为示例
155+ 我们提供了一个名为` trans() ` 的函数作为示例。
156156
157- 你需要保证有一个且有唯一一个“注册”的函数用于最终提交,我们将靠“注册”时的description进行区分,请确保你的提交函数的description是“Transpose submission” ,比如
157+ 你需要保证有一个且有唯一一个“注册”的函数用于最终提交,我们将靠“注册”时的description进行区分,请确保你的提交函数的description是“Transpose submission” ,比如:
158158
159159``` c
160160char 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