Skip to content

リソースの生成と接続

Yuya Degawa edited this page Jun 5, 2023 · 4 revisions

リソースの生成と接続.md

はじめに

  • "リソース"とは,物理的な資源(演算器,レジスタetc)を実装したクラスのオブジェクトを指す
    • Thread(ハードウェアスレッド) 等の一部例外はある
  • リソースの生成と接続は全てXML 上の定義に従って行われる
  • このページでは,以下の情報についてまとめる 1. 1.

リソースの実装方法

リソースの実装手順は以下の通りである.本節ではこれらについて詳しく述べる.

  1. PhysicalResourceNode の継承と関連メソッドの定義
  2. パラメータ・マップを定義する
  3. リソース接続マップを定義する
  4. リソース型情報マップにクラスを登録する
  • 備考:リソースの生成や接続に関連する実装はSim/Resource 内にある

PhysicalResourceNode の継承と関連メソッドの定義

  • Sim/ResourceNode.h内のPhysicalResourceNodeを継承する
  • LoadParam()/ReleaseParam()をそれぞれコンストラクタとデストラクタで呼ぶ
    • 後で述べるパラメータ・マップ経由でパラメータの読み出しと保存が行われる
  • Initialize(InitPhase phase)を実装する
    • このメソッドは初期化の段階に応じて複数回呼ばれる
    • phaseINIT_PRE_CONNECTION/INIT_POST_CONNECTIONが渡される
    • INIT_PRE_CONNECTION オブジェクトが生成された直後のタイミング
    • INIT_POST_CONNECTION:全てのオブジェクトの接続が完了した後のタイミング.
  • Finalize()を実装する
    • このメソッドは,全てのオブジェクトが解放される直前のタイミングで呼ばれる.
    • このメソッドが呼ばれた時点では接続されている全てのリソースはまだ生きているため,それらを参照した終了処理を行うことができる

パラメータ・マップの定義

  • リソースの入力パラメータやシミュレーション結果とXMLのマッピングを定義する

    • 具体的には,クラス上の変数と入出力XMLのマッピングを行う
    • 詳細はParamDB, ParamExchangeの仕様を参照
  • 以下は典型的なパラメータ・マップの例(Fetcherから抜粋)

    • 変数:
      • m_fetchWidthはフェッチ幅(入力パラメータ)
      • m_numFetchedOpはフェッチされた命令の数(出力パラメータ)
    • XML上のParameter/Fetcher/@FetchWidthm_fetchWidthにバインドされる

C++ソース:

class Fetcher : public PhysicalResourceNode
{
    int m_fetchWidth;
    int m_numFetchedOp;
public:
    BEGIN_PARAM_MAP("")
        BEGIN_PARAM_PATH( GetParamPath() )
            PARAM_ENTRY( "@FetchWidth", m_fetchWidth )
        END_PARAM_PATH()
        BEGIN_PARAM_PATH( GetResultPath() )
            PARAM_ENTRY( "@NumFetchedOp", m_numFetchedOp )
        END_PARAM_PATH()
    END_PARAM_MAP()
}

XML:

<Parameter>
  <Fetcher
    Name = 'fetcher'
    FetchWidth = '4'
  />
  ...
</Parameter>

パスの取得

  • PhysicalResourceNodeを継承したクラスでは,入出力パラメータのXML上位置は自動的に決まる
  • 以下のメソッドを使用することにより,取得可能
    • PhysicalResourceNode::GetParamPath()
      • そのクラスのパラメータのパスを取得
    • PhysicalResourceNode::GetResultPath()
      • そのクラスの結果のパスを取得

リソース接続マップの定義

  • C++上のオブジェクトへのポインタ変数とXML上での名前をマッピングする
  • 具体的には,以下の3つのマッピングを行う 1. * リソースの型名 * C++ソース/XML 上で共通の名前を使用 1. * XML上から参照される際の変数名 * XML上でのみ使用 1. * 他のリソースへの参照を保持する変数の名前

書式

BEGIN_RESOUCE_MAP()
    RESOUCE_ENTRY( "参照変数の型名","XML上での名前", "リソース上の変数名" )
    RESOUCE_SETTER_ENTRY( "参照変数の型名","XML上での名前", "Setterの名前" )
END_RESOUCE_MAP()
  • リソース上の変数を配列としたい場合(Coreが複数のThreadを持つとか),以下の方法がある
    • 鬼斬組み込みのリソースの配列を使用する
      • PhysicalResourceArray<参照変数の型名>により定義可能
      • RESOUCE_ENTRYで,通常のポインタと同様にマッピング可能
    • Setterを使用して,独自に保持する
      • RESOUCE_SETTER_ENTRY を使用して,Setterをマッピング
      • Setterのプロトタイプは,void Setterの名前( 参照変数の型名* ref );

リソースの実装:

class Fetcher : public PhysicalResourceNode
{
    CacheIF* m_iCache;
public:
    BEGIN_RESOUCE_MAP()
        RESOUCE_ENTRY( CacheIF, "iCache", m_iCache )
    END_RESOUCE_MAP()
    ...
}

XML:

<Fetcher Name= 'fetcher'>
  <Cache Name = 'cacheL1I' To = 'iCache' />
</Fetcher>

上記の例の場合,

  • Cache型のcacheL1Iと言うリソースが,
  • Fetcher型のfetcherが持つ
  • CacheIF型のm_iCacheに代入される

XML上のFetcher::iCacheと,C++上でのCacheIF* Fetcher::m_iCacheのバインドを行っているとも言える


リソース型情報マップへのクラスの登録

  • Sim/Resouce/ResourceMap.h 内のマップへ作成したクラスを登録する

書式

  • RESOUCE_INTERFACE_ENTRY(インターフェース名)

    • インターフェース(抽象クラス)を登録する際に使用
  • RESOUCE_TYPE_ENTRY(クラス名)

    • クラスを登録する際に使用
  • 例:

BEGIN_RESOUCE_TYPE_MAP()
    RESOUCE_INTERFACE_ENTRY(EmulatorIF);
    RESOUCE_TYPE_ENTRY(CheckpointMaster)
END_RESOUCE_TYPE_MAP()

生成・接続情報XMLのフォーマット

  • リソースの生成と接続の情報は,Simulator/Configurations/ 以下のノードで定義される
  • 以下では,このノードからトップダウンに各ノードの説明を行う

<Configurations>

  • 複数の定義ノード(名前は任意)を子に持つ
    • 複数の定義ノードのうち,Simulator/@Configurationで指定されたノードが実際に使用される
    • デフォルトではDefaultConfigurationが使用される
    • 外部からリソースの生成方法を変更したい場合は,新しい定義ノードを作成し,Simulator/@Configurationで指定すれば良い
    • 以下はデフォルトの状態の抜粋
<Simulator Configuration='DefaultConfiguration'>
  <Configurations>
    <DefaultConfiguration>
      <Constant>
        ...
      />
      <Structure>
        ...
      </Structure>
      <Parameter>
        ...
      </Parameter>
    </DefaultConfiguration>
  </Configurations>
  ...
</Simulator>

<DefaultConfiguration>(定義ノード)

  • ここでは便宜上,定義ノードを<DefaultConfiguration>とする
  • <DefaultConfiguration>は以下の要素を持つ
    • <Constant>
      • リソース生成時に使用する定数を定義
    • <Structure>
      • リソースの生成と接続方法を記述
    • <Parameter>
      • リソースに与える初期化パラメータを記述

<Constant>

  • <Structure>内でリソースの生成数を指定する際に使用する定数を定義する
  • デフォルトでは以下の3つが定義されている
    • @ThreadCount
      • Copy内のスレッド数
    • @CoreCount
      • Copy内のコア数
    • @MemoryCount
      • Copy内のメイン・メモリ数
  • CopyについてはStructureノード内の説明を参照
  • 以下はデフォルトの状態の抜粋
<Constant
  ThreadCount='1'
  CoreCount='1'
  MemoryCount='1'
/>

<Structure>

  • リソースの生成と接続の方法を定義する
  • Copy以下の入れ子の構造が仮想的にCopyの個数分存在していると考える
    • 後述の例を参照
    • 適当な説明ですいません
<Structure>
  <Copy Count='ThreadCount'>
    <リソースのクラス名 Name='リソースのインスタンス名' Count='リソースの生成数'/>
    ...
  </Copy>
</Structure>

生成

  • Name属性で指定された名前で,Count属性で指定された個数のリソースを生成
<リソースのクラス名 Name='リソースのインスタンス名' Count='リソースの生成数'/>

接続

  • あるリソースが他のリソースを持つ構造を,XMLの入れ子によって表現
    • '親'の持つ接続先変数に対し,子を接続する
<親クラス名 Name='親クラスのインスタンス名'>
  <子クラス名 Name='子クラスのインスタンス名' To='接続先の変数名'/>
</親クラス名>
    • 以下の例の場合,Parentクラスのparent.m_childChildクラスのオブジェクトchildを接続する
    • parent.m_child <= child
<Parent Name='parent'>
  <Child Name='child' To='m_child'>
</Parent>
  • 備考
    • 入れ子は再帰的に持つことも可能
    • To属性は省略可能.その場合,Name属性と同名の要素に対して接続が行われる
    • Count属性を指定することにより,接続と生成を同時に定義することも可能
    • 生成は行わずに接続だけを行う場合,子クラス名ではなく<Connection> を使用することも出来る.属性の構文は同じ

  • 以下の定義が存在した場合,図のようにリソースが生成,接続される
<Copy Count='4'>
  <Core Count='2'>
    <Thread Count='4'>
      <L1Cache Count='2'>
        <L2Cache Count='1'/>
      </L1Cache>
    </Thread>
  </Core>
</Copy>

##ref(structure.png)

<Parameter>

  • リソースの初期化パラメータを定義する
<Parameter>
  <リソースの型
    Name = 'リソースのインスタンス名'
    パラメータ名 = '値'
  />
</Parameter>
  • 例については,前述のパラメータ・マップの定義の項を参照
Clone this wiki locally