MIPS64r6(整数のみ)に対応したISSを公開しました。64bitでコンパイルしたCoremarkの完走を確認しました!
Swimmer-ISSのコンパイル方法
$ git clone https://github.com/msyksphinz/swimmer_iss.git --recursive Cloning into 'swimmer_iss'... remote: Counting objects: 2025, done. remote: Compressing objects: 100% (112/112), done. remote: Total 2025 (delta 84), reused 27 (delta 27), pack-reused 1886 Receiving objects: 100% (2025/2025), 522.70 KiB | 138.00 KiB/s, done. Resolving deltas: 100% (1469/1469), done. Checking connectivity... done. Submodule 'benchmarks' (https://github.com/msyksphinz/benchmarks) registered for path 'benchmarks' Submodule 'vendor/gflags' (https://github.com/gflags/gflags.git) registered for path 'vendor/gflags' Submodule 'vendor/gperftools' (https://github.com/gperftools/gperftools.git) registered for path 'vendor/gperftools' Cloning into 'benchmarks'... remote: Counting objects: 1125, done. remote: Compressing objects: 100% (18/18), done. ...
まずは、google-flagをコンパイルして、ISSに結合するためのライブラリを作成します。
$ cd swimmer_iss/vendor/gflags
$ cmake .
$ make
$ cd ../../build_mips64
$ cmake .
$ make
これで./swimmer_mips64がビルドされる。
ベンチマークの実行方法
benchmark/releases/coremark_mips64r6_img49_O2/ に、既にコンパイル済みのCoremarkを格納している。これを実行してみよう。
$ ./swimmer_mips64 --binfile ../benchmarks/coremark_v1.0/coremark.bin --debug --debug_func --reg_abi soft --out coremark.run.log --max 1000000 --trace_hier --trace_out coremark.trace.log
各オプションの意味
- --debug : デバッグトレースを生成する
- --out : デバッグトレースの生成ファイル名を指定する。今回はcoremark.run.logを指定した
- --debug_func : デバッグトレース内に、どの関数内を実行しているかを表示させる
- --max : 最大命令実行数を指定する。Coremarkは長いので、十分に大きな数値を指定しておく
- --reg_abi : デバッグトレース内のレジスタの表記を「r10」のようなハードウェア向けの表記とするか、「s2」のようなソフトウェア向けの表記とするかを指定する。
- --trace_hier : 関数の実行トレースを生成する
- --trace_out : 関数の実行トレースの生成ファイル名を指定する。今回はcoremark.trace.logを指定した
ベンチマークの実行結果
coremark.run.log の内容(抜粋)
... 62 : [ffffffff8000262c] ffb00090 : sd s0,0x0090(sp) sp=>ffffffff7f003f38 s0=>0000000000000000 (ffffffff7f003fc8)<=00000000 (ffffffff7f003fcc)<=00000000 63 : [ffffffff80002630] afa00078 : sw zero,0x0078(sp) sp=>ffffffff7f003f38 zero=>0000000000000000 (ffffffff7f003fb0)<=00000000 64 : [ffffffff80002634] ebfffc90 : balc 0x3fffc90 ra<=ffffffff80002638 pc<=ffffffff80001878 <Func: portable_init 0xffffffff80001878> 65 : [ffffffff80001878] 67bdfff0 : daddiu sp,sp,0xfff0 sp=>ffffffff7f003f38 sp<=ffffffff7f003f28 66 : [ffffffff8000187c] 3c02bfc0 : lui v0,0xbfc0 v0<=ffffffffbfc00000 67 : [ffffffff80001880] ffb00000 : sd s0,0x0000(sp) sp=>ffffffff7f003f28 s0=>0000000000000000 (ffffffff7f003f28)<=00000000 (ffffffff7f003f2c)<=00000000 68 : [ffffffff80001884] 0080802d : daddu s0,a0,zero a0=>ffffffff7f003fa2 zero=>0000000000000000 s0<=ffffffff7f003fa2 69 : [ffffffff80001888] 3c040000 : lui a0,0x0000 a0<=0000000000000000 70 : [ffffffff8000188c] 644206d0 : daddiu v0,v0,0x06d0 v0=>ffffffffbfc00000 v0<=ffffffffbfc006d0 71 : [ffffffff80001890] 64840000 : daddiu a0,a0,0x0000 a0=>0000000000000000 a0<=0000000000000000 72 : [ffffffff80001894] ffbf0008 : sd ra,0x0008(sp) sp=>ffffffff7f003f28 ra=>ffffffff80002638 (ffffffff7f003f30)<=80002638 (ffffffff7f003f34)<=ffffffff 73 : [ffffffff80001898] 0004203c : dsll32 a0,a0,0x00 a0=>0000000000000000 a0<=0000000000000000 74 : [ffffffff8000189c] 0082202d : daddu a0,a0,v0 a0=>0000000000000000 v0=>ffffffffbfc006d0 a0<=ffffffffbfc006d0 75 : [ffffffff800018a0] e80000d1 : balc 0x00000d1 ra<=ffffffff800018a4 pc<=ffffffff80001be8 <Func: ee_printf 0xffffffff80001be8> 76 : [ffffffff80001be8] 67bdfe40 : daddiu sp,sp,0xfe40 sp=>ffffffff7f003f28 sp<=ffffffff7f003d68 77 : [ffffffff80001bec] ffb00130 : sd s0,0x0130(sp) sp=>ffffffff7f003d68 s0=>ffffffff7f003fa2 (ffffffff7f003e98)<=7f003fa2 (ffffffff7f003e9c)<=ffffffff ...
coremark.trace.log の内容(抜粋)
<FunctionCall 47: main(0x800025f8)> <FunctionCall 64: portable_init(0x80001878)> <FunctionCall 75: ee_printf(0x80001be8)> <Return: ee_printf> <Return: portable_init> <FunctionCall 923: get_seed_32(0x80001608)> <Return: get_seed_32> <FunctionCall 940: get_seed_32(0x80001608)> <Return: get_seed_32> <FunctionCall 957: get_seed_32(0x80001608)> <Return: get_seed_32> <FunctionCall 974: get_seed_32(0x80001608)> <Return: get_seed_32> <FunctionCall 991: get_seed_32(0x80001608)> <Return: get_seed_32> <FunctionCall 1092: core_list_init(0x80000720)> <FunctionCall 1187: core_list_mergesort(0x80000338)> <FunctionCall 1227: cmp_idx(0x80000000)> <Return: cmp_idx> ...