シミュレータ

提供: IS2005 Wiki (CPU実験)
移動: 案内検索

メモ:最新のコンパイラコードは、古いバージョンのシミュレータで実行できなくなっています。これは、put命令、get命令の処理が変更されたためです(命令セット[2x]参照)。コンパイラのページにある新しいバージョンのシミュレータを使用します。

メモ:コンパイラのページにあるシミュレータはさらに更新されました。更新されたシミュレータは[[プロセッサ [2x]]]のページにあります。

3/6 新sincos

昨年のfirexhlで使われていた方式で実装してみました(xhl.cとsincos.s)。指数部が152を超えるあたりから誤差が発生してしまいますが、これまでの2πの倍数を引く方式よりはだいぶ精度が良いようです。

sincos.sをテストしていたら、0x4141D16E fsub 0x40C90FDB の結果が、シミュレータでは 0x40BA9302、Cのプログラムでは 0x40BA9301となっていました。どうしたものでしょう。

シミュレータとアセンブラを少し修正しました。

media:シミュレータ-"assembler.060306.zip"

1/22 関数呼び出しのカウント

JALからラベルに飛ぶ回数を数えてみました。以下はcontest.sldを計算させた結果です。

./a.out min-rt.bin sld/contest.bin ppm/contest.ppm
Operations executed
----------------------------------------------------------------
ADD      : 422544857
SUB      : 2994757
SLL      : 139670897
SRR      : 27757726
AND      : 4262640
OR       : 0
XOR      : 28065642
NOT      : 0
FADD     : 60037783
FSUB     : 57195568
FMUL     : 119303594
FINV     : 1516934
FSQRT    : 2197844
RD       : 1300
WR       : 154913
SIN      : 0
COS      : 0
ATAN     : 0
BR       : 0

Label called from JAL
----------------------------------------------------------------
rt.3079         : 1
min_caml_div    : 56602
min_caml_float_of_int   : 16623
create_pixelline.3026   : 3
create_pixel.3021       : 384
min_caml_create_float_array     : 19001
create_float5x3array.3019       : 1536
min_caml_create_array   : 3297
read_parameter.2744     : 1
read_screen_settings.2725       : 1
min_caml_read_float     : 212
rad.2723        : 4
min_caml_cos    : 1004
min_caml_sin    : 5734
min_caml_fneg   : 1927784
read_light.2727         : 1
min_caml_read_int       : 113
read_all_object.2736    : 1
read_nth_object.2732    : 18
min_caml_fisneg         : 5006280
min_caml_fiszero        : 11192350
sgn.2598        : 122912
min_caml_fispos         : 7854748
min_caml_fsqr   : 17954371
vecunit_sgn.2624        : 16386
min_caml_sqrt   : 2197844
read_and_network.2742   : 1
read_net_item.2738      : 43
read_or_network.2740    : 3
write_ppm_header.2987   : 1
min_caml_print_char     : 32773
min_caml_print_int      : 3
min_caml_print_int_pos  : 56600
min_caml_mul    : 86380
init_dirvecs.3062       : 1
create_dirvecs.3055     : 1
create_dirvec.3050      : 601
create_dirvec_elements.3052     : 5
calc_dirvec_rows.3046   : 1
calc_dirvecs.3041       : 10
calc_dirvec.3033        : 100
adjust_position.3030    : 1000
min_caml_atan   : 1000
tan.3028        : 1000
d_vec.2713      : 22730701
vecset.2606     : 782214
add_mod5.2603   : 16572
init_dirvec_constants.3057      : 5
setup_dirvec_constants.2842     : 602
d_const.2715    : 15955271
o_form.2654     : 23584119
setup_surface_table.2833        : 1204
o_param_a.2662  : 15144861
o_param_b.2664  : 13092163
o_param_c.2666  : 9692918
setup_second_table.2836         : 5418
quadratic.2767  : 3444202
o_isrot.2660    : 3663074
setup_rect_table.2830   : 3612
o_isinvert.2658         : 13998105
min_caml_xor    : 2081443
fneg_cond.2600  : 206098
veccpy.2616     : 167742
setup_reflections.3077  : 1
o_reflectiontype.2656   : 18497
o_diffuse.2676  : 567663
min_caml_fless  : 35627931
o_param_abc.2668        : 832786
veciprod.2627   : 1743576
add_reflection.3064     : 1
pretrace_line.3003      : 128
vecbzero.2614   : 150396
trace_ray.2933  : 16384
p_surface_ids.2698      : 180662
judge_intersection.2896         : 23755
trace_or_matrix.2892    : 23755
solver.2786     : 173579
o_param_x.2670  : 8437945
o_param_y.2672  : 8343343
o_param_z.2674  : 8437945
solver_rect_surface.2746        : 195262
min_caml_fabs   : 25984199
solve_one_or_network.2888       : 30531
solve_each_element.2884         : 135676
veciprod2.2630  : 629987
check_all_inside.2869   : 1779616
is_outside.2864         : 3133247
bilinear.2772   : 74271
get_nvector.2918        : 660732
utexture.2921   : 660732
o_texturetype.2652      : 660732
o_color_red.2680        : 660732
o_color_green.2682      : 660732
o_color_blue.2684       : 660732
p_intersection_points.2696      : 31490
p_calc_diffuse.2700     : 55488
vecaccum.2635   : 45411
o_hilight.2678  : 18496
shadow_check_one_or_matrix.2881         : 671071
solver_fast.2809        : 4266685
shadow_check_one_or_group.2878  : 870017
shadow_check_and_group.2875     : 3270896
add_light.2924  : 27884
setup_startp.2847       : 37097
o_param_ctbl.2692       : 12309001
trace_reflections.2928  : 18496
r_dvec.2719     : 18496
judge_intersection_fast.2910    : 1134556
trace_or_matrix_fast.2906       : 1134556
solver_fast2.2827       : 11678352
solve_one_or_network_fast.2902  : 1819379
solve_each_element_fast.2898    : 8647162
p_rgb.2694      : 32768
p_set_group_id.2708     : 16384
pretrace_diffuse_rays.2993      : 16384
get_surface_id.2971     : 151905
scan_pixel.3007         : 128
neighbors_exist.2967    : 16384
do_without_neighbors.2964       : 508
write_rgb.2991  : 16384
write_rgb_element.2989  : 49152
min_caml_int_of_float   : 49152
try_exploit_neighbors.2980      : 15876
neighbors_are_available.2974    : 17844
p_energy.2702   : 22250
vecscale.2645   : 11125
p_nvectors.2711         : 24119
r_surface_id.2717       : 11283
r_bright.2721   : 10339
p_group_id.2706         : 12994
trace_diffuse_rays.2947         : 17109
trace_diffuse_ray.2939  : 1116060
p_received_ray_20percent.2704   : 59274
min_caml_floor  : 189204
calc_diffuse_using_1point.2955  : 1869
trace_diffuse_ray_80percent.2951        : 1869
calc_diffuse_using_5points.2958         : 9256
vecadd.2639     : 37024

環境はux101.ecc.u-tokyo.ac.jpでだいたい45分くらいかかってしまいました。 diffを取ったら一致しない点が多数あったので、三角関数などの精度がまだ足りないようです。 media:シミュレータ-simulator.0122.zip

12/19 中間発表

あまり内容がなくて申し訳ないのですが、とりあえずこんな感じでしょうか。

  • アセンブラ
    • Perlで記述
    • アセンブリをhexに直してテキスト/バイナリにする
  • シミュレータ
    • C言語で記述
    • hex形式の命令列を読んで実行
    • ブレークポイントの設定、ステップ実行
    • I/Oは今のところ標準入出力
    • 実機のFPUの動作をシミュレート(by平野氏)
  • ライブラリ
    • 外部関数のアセンブリを書いてコンパイル後のアセンブリにコピペ
    • floor、ftoi、itofは完成(by平野氏)
    • 三角関数はソフトウェアで実現(多項式近似、CORDIC?)

とりあえずCORDICというものをCで書いてみました。誤差評価がまだですが・・・ media:シミュレータ-cordic.c

12/8 Thanks! > ひらの氏

まったくその通りでした。全然気が付かなかった・・・

あとnamasute氏に質問なんですが、create_pixellineやinit_line_elementsなどの関数の末尾呼び出しの際には、jalではなくjumpを使うべきではないでしょうか?

namasute

うぐぅ、修正しますた。サンクスコ。

12/7

min-rt.mlを実行するために、いろいろと無理矢理やってみた。

  • 外部関数(miniMLRuntime.mlにあるもの)はアセンブリコードのライブラリとしてlib.sに書いた。
  • グローバル変数については各変数が使う領域の初期のサイズを調べ、それが指すアドレスをリストにしたものをglobals.sに書いた。
  • 三角関数などの数学関数については全て命令としてシミュレータが計算するようにした。
  • シミュレータ用に、sin, cos, atanの3つの数学関数命令、浮動小数専用の入力命令frd、デバッグ用命令br(br numでその位置で実行を一時停止しnumと状態を表示)を追加した。

なおバイナリを生成する際はコンパイラが吐いたmin-rt.sの最後にglobals.sとlib.sをコピペするという原始的な方法をとっている。そのうちリンカみたいなかっこいいものを作りたいが。

現在、min-rt.outを実行すると謎のセグフォで落ちてしまう。gdbで追っても原因がわからず苦戦している。誰かわかる方がいたら教えてください。

review by ひらの

たぶんcalc関数の再帰のしすぎだと思った。

for構文に修正すれば直るかと思う。


11/5

review by ひらの

とりあえず、乙です。zipファイルの中身を一見してシミュレータだけかと思ってmakeしてみるとアセンブラも出てきてちょっと驚いた。lexer使いこなしておる図。アセンブラはちょうど非常に欲しかったところだったので、ありがたい。 ラベル機能とか付加していくとそうもシンプルなままとはいかないだろうが。

fibできた&バグ発見 by 高山

関数呼び出しの手続きを使ってfibを動かしました(やり方は駒場で習ったそのまんま)。途中でJUMPのバグを発見。

11/4

一応アセンブラと本体らしきものができた。(遅

まだ階乗プログラムしか試してないです。っつーかアセンブリコード考えるのがめんどい希ガス