carrot

carrot

@carrot

  • zxia Post #5

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

    我放几张图就很清晰了:

    原版:
    original

    执行 50 次 poly 取均值:
    截屏 2024-06-09 20.30.07

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

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

  • zxia Post #3

    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() 实现私发给助教(我),我尝试复现现象之后再进行分析。