マルチコア・マルチスレッド実行 - onikiri/onikiri2 GitHub Wiki

dst/設定/マルチコア・マルチスレッド実行.md

概要

  • 鬼斬はマルチコアやSMTのシミュレーションをサポートしている
  • 今のところ,完全に独立した複数のプロセスの実行のみをサポート

実装済みの要素

  • マルチコア(非対称含む)
  • SMT
  • 共有キャッシュ

未実装の要素

  • プロセスやスレッド間の通信,同期
  • プロセスやスレッドの動的な作成
  • メモリ・モデル
  • キャッシュ・コヒーレンス

基本的な設定の方法

  • ここでは,簡単な設定方法の例についてのみ述べる
  • マルチスレッド実行のために設定を行う必要がある場所は主に以下の2カ所である
    • リソース生成数
    • 実行バイナリなどの起動プロセスの設定
  • ここでリソースとは,コアやスレッド,分岐予測器や実行ユニットなどの資源を表す

リソース生成数の指定

  • リソースの生成は,Constant内で定義された定数(あるいは数字)を用いて,Structure/Copy以下で指定された方法により行われる

    • 典型的には,Simulator/Configurations/DefaultConfiguration/Constant 以下の定数を書き換えることにより設定
    • ThreadCountやCoreCountはシステム全体のスレッド数やコア数を表す点に注意
      • 正確には,システム全体ではなく,Structure/Copy 以下のツリー内での個数を表す
  • 詳細については,仕様/その他/リソースの生成と接続の項を参照

  • 以下はリソース数の設定例

1コア/2スレッドSMT

  • CoreCount=1
  • ThreadCount=2

2コア/シングルスレッド

  • CoreCount=2
  • ThreadCount=2
    • スレッド数はシステム全体で2つであるため,ThreadCountは2

2コア/2スレッドSMT

  • CoreCount=2
  • ThreadCount=4
    • スレッド数はシステム全体で4つであるため,ThreadCountは2

起動プロセスの指定

  • 基本的には,以下のようにしてEmulator/Processes 以下で複数のプロセス情報を記述することにより設定
<Processes>
  <Processs
     Command='a.out'
     ...
  >
  <Processs
     Command='b.out'
     ...
  >
</Processes>
  • 詳細はEmulator の項を参照
  • 実際には,以下のようにしてプロセス情報が記述されたXML を複数インポートすると良い
    • この例は,gzipとvprを起動する場合の例
<Session>
  <Import>
    <File Path="benchmark/SPECCPU2000_INT/alpha64/cmd/164.gzip-train.0.xml" />
    <File Path="benchmark/SPECCPU2000_INT/alpha64/cmd/175.vpr-train.0.xml" />
  </Import>
  ...

その他の設定

非対称マルチコアの設定方法

  • 複数のCopy ノードを作成することにより,それぞれのコアの構成が異なるマルチコアのシステムを作ることが出来る
    • コア構成ごとにCopy ノードを作成し,Configuration ノード以下に配置する
  • (そのように実装したので理論上できるはずですが,試していないので誰かテストしてみてくださいお願いby塩谷

共有キャッシュ

  • キャッシュの生成数を指定することにより,複数コア間でキャッシュを共有できる
  • 共有L2キャッシュを設定する場合,以下のノードのCount を1にすると複数コア間で1つのL2キャッシュが共有される
<Cache Name = 'cacheL2'  Count='CoreCount'>
  • Count に1以外を指定した場合,システム全体でその数のL2キャッシュが生成され,接続される
    • たとえばCoreCountを8,L2の数を2とした場合は4つのコア間でそれぞれのL2キャッシュが共有される
⚠️ **GitHub.com Fallback** ⚠️