optim lab 中一个很有趣的现象(与分数无关),求大神解答

实验已经做完了,但是碰见一个十分神奇的现象,求大神解答:

  1. 我在 CLI 中 make grade 的成绩一直是 100/100
  2. 闲着无聊将 CLI 中我的键盘输入 / 打分脚本的输出 复制进 CLI_output.txt 中:显示所有分数是 100/100
  3. 使用./grade >> test.txt 将 CLI 中的结果重定向到 test.txt 中,发现有些的分数变成了 75/100 了

具体的操作是:在命令行中敲击了 5 次 make grade 与 5 次./grade >> test.txt

  • CLI_output.txt 中的分数是 5 个 100/100(是复制进去的,所以很显然没变化)
  • test.txt 中分数分别是 75/100, 75/100, 100/100, 75/100, 100/100

很想了解一下这里的打分程序 grader 是怎么运行的,主要是不太熟悉逆向工程,因此没有对 optim/grader 二进制文件进行操作

CLI_output.txt (3.4 KB)
test.txt (2.8 KB)

1 Like

补充:
所有从 100->75 都是在最后一个环节

=============== Test 4: Measuring poly_optim() ================
Measured CPE of poly_optim():

从 25 → 0

grader 是怎么运行的:查看 Makefile 可以知道 grademain.c, poly.cmeasure_time_std.o 编译而来的,其中 measure_time_std.o 是测量执行时间的标准实现编译后的目标文件。执行 ./grade 时执行的便是 main.c 中的代码。

现象的解释:首先我没能复现出这个现象,我尝试以几种方式修改 measure_time() 函数后,要么都是 100 分要么都是 75 分。
我给出我对这一现象的原因的猜测如下:输出重定向到文件后最后一个 test 不再得分,并且测得的 CPE 都明显偏大,初步猜测是测量时间的函数没有预热 cache,而输出重定向到文件的操作比直接输出到终端要更复杂,从而使 cache miss 增加,测得的 CPE 就偏大。但这只是猜测的结论、很可能不正确,如果想进一步讨论可以将你的 measure_time() 实现私发给助教(我),我尝试复现现象之后再进行分析。

2 Likes

a.c (716 字节)
原问题对应的 measure_time() 函数内,在测量时间之前,已经用 poly 预热一遍了,不知道是否是处理不当 / 还是说有其他错误?

我看到了你的源码,你的 measure_time 函数在两次 clock_gettime() 之间只执行了一次 poly 函数,可能波动会比较大,多执行几次 poly 函数的话波动会被多次的执行均摊,测量结果会更稳定。

我放几张图就很清晰了:

原版:

执行 50 次 poly 取均值:

可以看到取均值的方法得到的数据线性化程度更好,我个人认为这足以说明这样测得的数据更可信。

题外话,可以看到图中有一些离群点,我在打分程序(main.c)中使用了 RANSAC 算法尝试减少离群点带来的影响。但实际上由于离群点数量远小于样本数量,不用 RANSAC 算法结果也已经足够令人满意(如上图所示)。

3 Likes

好的明白,谢谢老师!