トップ 新規 編集 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

gem5

[ソフトウェア,グリッド]

gem5

2013年度卒池田先輩に感謝

導入~実行まで

必要なソフトのインストール

$ sudo apt-get install scons swig python libssl-dev libssl-doc python-dev m4 zlib1g-dev libprotobuf-dev g++

20140110追加:必要ではないですが、tcmallocをインストールするとsconsの性能が12%向上するそうです。インストールは

$ sudo apt-get install libgoogle-perftools-dev

gem5とspec2006の解凍

なお,起動/実行に必要なgem5-20130308.tar.gzとstatic-spec2006-elf64.tar.gzはblackbaseの/home/ikeda/COMPRESSIONにおいてあります(いくつか他のバージョンのgem5もあります).

解凍はtarコマンドで解凍します.拡張子tar.gzを解凍する場合はオプションにxzvfを指定しますが,もし拡張子tar.bz2の圧縮ファイルを解凍する場合はxjvfを指定してください.

$ tar xzvf gem5-20130308.tar.gz
$ mv static-spec2006-elf64.tar.gz gem5-20130308
$ tar xzvf static-spec2006-elf64.tar.gz

gem5のコンパイル(コンパイルには20分か30分くらいかかります)

gem5のコンパイルはsconsコマンドでコンパイルしますがscons実行時に-jオプションをつけることでscons実行時にマルチコアでコンパイルできるそうです.

scons -j 4 build/X86/gem5.debugってやれば4コアでコンパイルするそうです(以下の例ではやってません).

$ cd gem5-20130308
$ scons -c                (-cでgem5バイナリの削除が出来ます)
$ scons build/X86/gem5.opt(sconsは,多分gem5のルートディレクトリじゃないと出来ません.正確にはSConstructというファイルがあるディレクトリ.違ったらすみません.その際は修正お願いします)
※コンパイルを行うときの注意※
新しいマシンにgem5本体を持ってきてシミュレータを実行しようとしても大抵出来ません.
なので,シミュレータが動かんって時はscons -c <gem5のバイナリ>ってやってシミュレータの削除を行ってから再コンパイルして下さい.

またgem5ではsconsコンパイル時に,build/<どんなアーキテクチャモデルでgem5バイナリを作るか>/<gem5バイナリのバージョン>とすることで,コンパイル時にディレクトリがなくても勝手にディレクトリを作りgem5バイナリを生成します.上の例ではX86アーキテクチャでgem5.optを生成しました.他にもALPHAアーキテクチャやARMアーキテクチャなどがあります.gem5バイナリのバージョンには.fastや.debugなどがあり,バージョンごとに機能が違うようです(詳しい仕様は,http://www.m5sim.org/Build_Systemにて.分かる人は追記よろしくお願いします).

例:POWERアーキテクチャでgem5.debugを作りたい場合.

$ scons build/POWER/gem5.debug

シミュレータの実行

$ pwd
/home/usr/gem5
$ cd static-spec2006-elf64
$ ../build/X86/gem5.opt ../configs/example/se.py [option]
[option] の引数一覧
--cpu-type                      detailedかinorderを引数に与える
-n N                            コア数N個で実行
--caches                        各コアはl1キャッシュを持つ
--l2cache                       共有l2キャッシュを持つ
-c                              SPEC2006のベンチマークを指定
-o                              -cで指定したベンチマークに与えるコマンド
-F N                            fastforward命令実行数N命令(指定した命令数Nまでシミュレータの計測を行わない)
-I N                            fastforward後の命令実行数N(-F指定時はその命令数まで計測せず,そこからN命令分だけ計測する.-F N -I MならN命令ファストフォワードして,M命令計測)
--cwd                           実行したいベンチマークがあるディレクトリ指定
**************************************************
****旧バージョンのスクリプトには多分無いオプション(旧バージョンではse.py でいじります)****
**************************************************
--mem-channels N                メモリチャネル数
--mem-size "<N>MB"              メモリ容量Nメガバイト(<>は外して下さい)
--mem-type                      メモリのアーキテクチャモデル指定(configs/common/MemConfig.pyに載ってます.デフォルトだとSimpleMemoryです)
その他引数は configs/common/Options.pyを見てください(キャッシュ容量とかキャッシュラインサイズとかもオプションで指定できます)
シングルコアでspec2006ベンチマークの401.bzip2を実行する例(DRAMサイズ2048MB, モデルDDR_1600_X64)
$ ../build/X86/gem5.opt ../configs/example/se.py --cpu-type detailed -F 10000 -I 10000 --mem-channels 4 --mem-size "2048MB" --mem-type "DDR3_1600_x64" --caches --l2cache -c 401.bzip2/bzip2 -o "chicken.jpg 30" --cwd "401.bzip2/"

SPEC2006に収録されているベンチマークに与えるコマンドはspec2006list.txt(63)を参考にしてください.結果は,(確か)現在自分がいるディレクトリに出来るm5out/stats.txtに入ってます(上の例では,static-spec2006-elf64/m5out/stats.txtに出力されます)設定したパラメータの確認はm5outフォルダのconfig.iniにて.

プリフェッチ機能の有効化

プリフェッチ機能を有効化するにはconfigs/common/CacheConfig.pyにて可能になります.
configs/common/CacheConfig.pyの途中から(60行目くらい)
    if options.l2cache:
       # Provide a clock for the L2 and the L1-to-L2 bus here as they
       # are not connected using addTwoLevelCacheHierarchy. Use the
       # same clock as the CPUs, and set the L1-to-L2 bus width to 32
       # bytes (256 bits).
       system.l2 = l2_cache_class(clk_domain=system.cpu_clk_domain,
                                  size=options.l2_size,
                                  assoc=options.l2_assoc)
       system.tol2bus = CoherentBus(clk_domain = system.cpu_clk_domain,
                                    width = 32)
       system.l2.cpu_side = system.tol2bus.master
       system.l2.mem_side = system.membus.slave
       system.l2.prefetch_on_access = 'true'                              *この行を追加する
       system.l2.prefetcher = StridePrefetcher(degree=8, latency = 1)     *この行を追加する

複数コアで実行したい場合(例では2コア)

複数コアでベンチマークを実行したい場合は,-cコマンドでベンチマークのバイナリを指定する際にセミコロンで区切ります.-oでバイナリに与えるコマンドも同様です.

***注意!!***
spec2006list.txtを見ると,引数を指定しなくても動くベンチマークがあります(459.GemsFDTD等).-oオプションで記述する際はスペースで渡してください.じゃないと,途中で止まります.
実行例(2コアで401.bzip2と403.gcc)
$ ../build/X86/gem5.opt ../configs/example/se.py -n 2 --cpu-type detailed -F 10000 -I 10000 --caches --l2cache --mem-channels 8 --mem-size "4096MB" --mem-type "WideIO_200_x128" -c "static-spec2006-elf64/401.bzip2/bzip2;static-spec2006-elf64/403.gcc/gcc" -o "chicken.jpg 30;166.i -o 166.s" --cwd "401.bzip2/;403.gcc/"

チェックポイントの取り方&実行の仕方

gem5ではチェックポイントを取ることで,チェックポイントを取った段階でのマシンの状態を保存し,その状態からシミュレーションを行うことが出来ます.一度100億命令の状態のチェックポイント取れば,毎回のシミュレーションで100億命令分ファストフォワードしなくてもすむようになります.

チェックポイントの取り方

例えば,453.povrayを100億命令分実行した段階でチェックポイントを取りたい場合は以下のようにシミュレータのバイナリを実行します.

$ pwd
/home/usr/gem5
$ build/X86/gem5.opt configs/example/se.py -c "./static-spec2006-elf64/453.povray/povray" -o "SPEC-benchmark-ref.ini" --cwd "./static-2006-elf64/453.povray" --take-checkpoints "0,10000000000" --max-checkpoints=2 --checkpoint-at-end --mem-type "DDR3_1600_x64" --mem-size "8192MB"

チェックポイントに関するオプションについての説明

--take-checkpoints N, M                  N命令からM命令までのチェックポイントを取る
--max-checkpoints=N                      N個チェックポイントを取る(デフォルトでは5個取る)
--checkpoint-at-end                      これを指定すると,--take-checkpointsで指定した命令でシミュレーションを終了する(指定しなかったらずっと動く?もし違っていたらすみません.その際は修正お願いします)

これを実行すると,m5outディレクトリにcpt.0とcpt.10000000000というディレクトリができていると思います.この中に453.povrayのチェックポイントが入ってます.多分このままだと実行出来ないと思うので,cpt.10000000000をcpt.453.povray.10000000000に変更します(もしかしたら名前変えなくても出来るかも.もし誰か試してみて実行できたら修正お願いします).cpt.0は消して構いません.

このままでは実行時にめんどくさいので,適当なディレクトリに移動したほうがいいと思います.この例では,gem5/checkpoint/cpt.453.povray.10000000000とします.

チェックポイント実行の仕方

上でとった100億命令の453.povrayのチェックポイントを実行するには以下のようになります.

$ pwd
/home/usr/gem5
$ build/X86/gem5.opt configs/example/se.py --cpu-type detailed --caches --l2cache --mem-type "DDR3_1600_x64" --mem-size "8192MB" --mem-channels 4 -n 1 -I 100000000 -r 10000000000 --at-instruction --checkpoint-dir "./checkpoint/" -c "./static-spec2006-elf64/453.povray/povray" --cwd "453.povray" --bench "453.povray"

コマンドを見て気づく方もいると思いますが,チェックポイント実行時には-oでspec2006ベンチマークへの引数を指定しなくても実行してくれます(-oで引数を指定しても動きますが,-oを付けない時と同じ結果が出力されます).何気に便利だと思います.

オプションの説明
-r                      チェックポイントを取った時の実行命令数です.多分,このオプションでチェックポイントディレクトリを指定するんだと思います(自信なし.もしかしたら--at-instructionあったら-r無くてもいいかもしれない).
--at-instruction        これを指定すると,チェックポイントを取った時の実行命令数から開始します.
--checkpoint-dir        チェックポイントディレクトリが入ってるディレクトリの指定.ここではgem5/checkpoint/cpt.453.povray.10000000000となっているので,checkpointディレクトリを指定.       
--bench                 どのベンチマークを実行するかのオプション.合成チェックポイント(後述)ではハイフンを用いて区切ります.

checkpoint_aggregator.pyによるチェックポイント合成

*注意*新しいバージョンでのgem5のチェックポイント合成がうまくいかないです.うまくいった方,追記お願いします.

gem5/util/にある,checkpoint_aggregator.pyによって,シングルコアで取ったチェックポイントをマルチコア用に合成することが出来ます.以下の例ではgem5/checkpointに,cpt.401.bzip2.3400000000とcpt.429.mcf.6790000000がある場合の例です.checkpointディレクトリにcheckpoint_aggregator.pyを移動します.

$ pwd
/home/usr/gem5
$ cp util/checkpoint_aggregator.py ./checkpoint
$ ls checkpoint
checkpoint_aggregator.py     cpt.401.bzip2.3400000000     cpt.429.mcf.6790000000
$ cd checkpoint
$ python ./checkpoint_aggregator.py 401.bzip2 429.mcf

とすると,gem5ディレクトリにagg-cptというディレクトリができていると思います(何故かcheckpoint_aggregator.pyを実行したディレクトリの一つ上の階層のディレクトリに出来る.).agg-cptディレクトリにはcpt.400.perlbench-401.bzip2.10000というディレクトリが出来ており,これが400.perlbenchと401.bzip2の合成チェックポイントです.

合成チェックポイントの実行は以下のようにしてください.

$ pwd
/home/usr/gem5
$ build/X86/gem5.opt configs/example/se.py --cpu-type detailed --caches --l2cache --mem-type "DDR3_1600_x64" --mem-size "8192MB" --mem-channels 4 -n 2 -I 100000000 -r 10000 --at-instruction --checkpoint-dir "./agg-cpt/" -c "./static-spec2006-elf64/400.perlbench/perlbench;static-spec2006-elf64/401.bzip2/bzip2" --cwd "400.perlbench/;401.bzip2/" --bench "400.perlbench-401.bzip2"

合成チェックポイント利用時の注意点

新しいバージョンのgem5では,-rオプションと--at-instructionが一緒にあると実行できないです(実行時にcore dumpedします).何故か-rオプションがなくても実行できるので,--at-instructionオプションだけにしといた方がいいです.

spec2006list.txt[削除]

最終更新時間:2014年06月13日 02時21分27秒