FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

64bit MIPSに対応したISSを公開しました

MIPS64r6(整数のみ)に対応したISSを公開しました。64bitでコンパイルしたCoremarkの完走を確認しました!

github.com

Swimmer-ISSコンパイル方法

まずはgithubからソースコードをダウンロードします。

$ 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

次に、ISS本体をコンパイルします。

$ 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>
...