sysprog2016
主講人: jserv / 課程討論區: 2016 年系統軟體課程
返回「進階電腦系統理論與實作」課程進度表
根據教學可以輸出碎形,但是速度非常慢
$ git clone https://github.com/corsix/dynasm-doc.git
$ cd dynasm-doc
$ git submodule update --init
$ cp bf_c.c tutorial.c
$ gcc -o tutorial tutorial.c
$ ./tutorial mandelbrot.bf
現在要用 JIT 版本加速
首先要先在 header 中加上
#include "luajit-2.0/dynasm/dasm_proto.h"
#include "luajit-2.0/dynasm/dasm_x86.h"
接著將 interpreter 改為 compiler
- static void bf_interpret(const char* program, bf_state_t* state)
+ static void(* bf_compile(const char* program) )(bf_state_t*)
呼叫的部份也要改
- bf_interpret(program, &state);
+ bf_compile(program)(&state);
變數部份也要做一些新增和修改
- int nskip = 0;
+ dasm_State* d;
+ unsigned npc = 8;
+ unsigned nextpc = 0
接下來要根據不同平台去定義不同的 arch (硬體架構):
|.if X64
|.arch x64
|.else
|.arch x86
|.endif
在上面有宣告 dasm_State* d; 可以呼叫 dasm_init 來初始化
|.section code
dasm_init(&d, DASM_MAXSECTION);
第二個參數為在開始 define 的 DASM_MAXSECTION 1
結束以上動作後,還沒完全的初始化必須在 call dasm_setupglobal(&d, labels, lbl__MAX);
|.globals lbl_
void *labels[lbl__MAX];
dasm_setupglobal(&d, labels, lbl__MAX);
在 call dasm_setup(&d, bf_actions);
|.actionlist bf_actions
dasm_setup(&d, bf_actions);
將 actionlist 當作參數傳入
最後 call dasm_growpc(&d, npc); 來完成初始化
dasm_growpc(&d, npc);
npc 為目前被分配的 dynamic label
接下來要做一連串的定義,和巨集
接下來一樣做 Emitting 各 expression ,如 Arithmetic, I/O, Loops, 完成 compile。
用 JIT compiler 來執行之前的程式:
$ cp bf_dynasm.c tutorial.c
$ gcc -o minilua luajit-2.0/src/host/minilua.c -lm
$ ./minilua luajit-2.0/dynasm/dynasm.lua -o tutorial.posix64.c -D X64 tutorial.c
$ gcc -o tutorial tutorial.posix64.c
$ ./tutorial mandelbrot.bf
rubi 是成大資訊系師生合作開發、類似 Ruby 語法的程式語言實作,提供 JIT compiler,主體程式碼不到一千行,具體而微。Rubi 使用前述 DynASM 打造,請留意看 Makefile
得知編譯方式。
prog
的程式,熟悉 Rubi 語法,著手設計類似 A09: jit-compiler 裡頭整合性的 benchmark suite,提出改善內建 benchmark suite 效能的機制,並且要能夠充分解釋行為,需要一併透過 gnuplot 自動產生效能分析圖表