地址:https://mashplant.online/tomasulo,欢迎试用和找bug。需要声明的是这和本学期的计算机系统结构课没有任何关系,我是今天(6.11)才把它做出来的,也没有以任何形式告知助教。
最近学了一下Rust的WASM工具链,感觉用这一套来写这种给大家分享的算法模拟器是相当合适的,因为可以用Rust写,写的很舒服,而且可以在浏览器上访问,分享起来也很方便。
这里特别感谢jiegec,他的代码和指导给了我很大的帮助。同时也特别感谢n+e,因为我的页面是抄他的,其实我根本不会写前端。
历史
代码在这:https://github.com/MashPlant/tomasulo/。其实这个仓库是我寒假的时候建的,当时我以为这学期的系统结构的要求没有变,还是做一个带GUI的Tomasulo模拟器。去年这就是我退课的直接原因(当然,不是根本原因),当时是有点想用Rust写,但是不敢,把一个大作业交给一个我还不是很熟悉的语言,这听起来风险就很大。
到寒假我的Rust水平已经有了一定的提升,我做了一个带TUI(Terminal User Interface)的Tomasulo模拟器,感觉还是挺有特色的,用的是Rust的cursive那一套工具链。用起来其实不算顺手,很多常见的需求还得自己造轮子,不知道现在有没有好一些。代码在https://github.com/MashPlant/tomasulo/tree/cursive里。寒假里我粗略的写完之后没有做任何的测试(因为也没有测试数据),这里面一定存在一些逻辑错误,到开学又听说今年不用做GUI了,而且要求要用C/C++写,所以就是说我白做了,这些错误也懒得改了。
学期当中用C++做的时候从Rust这边翻译了很多代码过去,也经过了很多的修改,现在又要写Rust的版本,所以我又把它翻译回来。顺便说一句,我在翻译的时候发现我提交的C++代码有一处明显的逻辑错误,在给保留站分配功能部件的地方,也确实会导致两个测例输出的log不一样,但是我的这项作业还是满分。所以说其实没有太大必要担心正确性,助教不是那么死板的,当然我估计这种话给正在做的人说,他肯定是不愿意相信的。
前端是复制n+e的,这个我是真学不会,也没有什么地方系统的讲这个,其实我也没有什么学习热情。有一说一,n+e的后端的Python写的确实是不怎么样,当然他自己肯定写起来很快,我也相信他维护起来没有困难,只是苦了那些要看他的代码的学弟学妹了。
性能
n+e:
点击多步运行,输入100000(十万),来个死循环,大概1.8s这样能执行完。相比 https://tomasulo.harrychen.xyz/ ,同样程序他运行10000(一万)次就得花2-3s,我的效率是他的十倍左右。
(谁说python代码慢?)
附:死循环代码如下:
LD F1 0x0
MUL F3 F1 F1
JUMP 0x0 F3 0xFFFFFFFE
真的吗?我不信,TS/JS那一套的性能应该是相当不错的,毕竟都是钱砸出来的,怎么说也不可能比不过Python,我估计可能是实际做的事情不一样,比如Harry Chen的网络访问多一些,或者cycle之间有等待之类的。
我写的这个没有任何网络访问,都是在使用者的浏览器里算的,所以具体速度跟浏览器关系很大。这段代码输入前要稍作修改,因为这两年的语法并不一样。多步执行的输入框里输个10000000,console里执行:
1 | beg = new Date(); window.multi_step(); end = new Date(); end - beg |
结果在500ms左右,这个算是相当可以的速度了,我写的C++也只是这个数量级的,截一下我的报告:
实测了一下,跑这段代码10000000个cycle,我写的C++也要约300ms,WASM这一套的性能真的是相当不错了。