Summary of Projects for 281&370

前言

鸽了一周,今天开始恢复更新。就先总结过去一周所做的两个 Project,Pipelined Simulator & SillyQL。

Pipelined Simulator

370 的 p3,大概就是写一些代码模拟 pipeline 的运行过程,利用 Detect and Forward 处理 data Hazard,使用 branch-not-taken 解决 Control Hazard。因为暂时不会使用 c 语言的并行处理,所以利用两个 struct, State 和 newState 来模拟时钟上升沿 state 的瞬时更新。开写之前我其实没有完全理解这个方法,之后修改时又漏掉了 eq,给我造成了很大麻烦。 所以教训是要严格遵守 spec 的要求,例如 State 都作为左值,newState 都作为右值。整体而言 p3 难度不算大,我个人比较喜欢这种概念性比较强的 Project。

SillyQL

模拟一个简陋版的 sql,spec 指定了几个功能,首先实现 create,print,insert,remove,delete,然后实现 generate(给一个 col 加 hash/bst 以提高查找速度),join(两个 table 的交集)。写完 generate 之后要对 print 做一些优化(’>’, ‘<’时使用 bst 的 upper_bound, ‘=’ 时使用 hash)。

这里并不需要对 delete 做什么优化,因为‘=’时 remove_if 和使用 hash 查找从后往前 delte 时间复杂度都是 O(n)。delete 结束后需要 rehash/rebst。此处我以为‘=’时可以直接 erase bst 里的 key,这个操作导致了很严重的 bug,因为 bst 的 value 里存储的是每一个 key 对应的 row 的 index,如果某一行被 delete,之后所有 row 的 index 都会前移,所以会导致 bst 存储的 index 完全失效。

p3 算是目前为止我接触的比较大的 project,spec25 页,程序大概 900 行。因为比较缺乏大型 project 的经验,前后写了很久,debug 花了一天半,因此误了好几节 recording。好在程序结构问题,不用做额外的 speed & memory 优化。所以,之后的大型 project 一定要早点开始。安排好时间,起码不要误课,而且一直做一件事效率有点低。。。

总之,相比这学期开始,代码能力也算有一些提升,但还有很长路要走啊…
结尾附图一张

  1. 前言
  2. Pipelined Simulator
  3. SillyQL