シミュレータ
メモ:最新のコンパイラコードは、古いバージョンのシミュレータで実行できなくなっています。これは、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
一応アセンブラと本体らしきものができた。(遅
まだ階乗プログラムしか試してないです。っつーかアセンブリコード考えるのがめんどい希ガス