-
Notifications
You must be signed in to change notification settings - Fork 31
リソースの生成と接続
Yuya Degawa edited this page Jun 5, 2023
·
4 revisions
- "リソース"とは,物理的な資源(演算器,レジスタetc)を実装したクラスのオブジェクトを指す
- Thread(ハードウェアスレッド) 等の一部例外はある
- リソースの生成と接続は全てXML 上の定義に従って行われる
- このページでは,以下の情報についてまとめる 1. 1.
リソースの実装手順は以下の通りである.本節ではこれらについて詳しく述べる.
- PhysicalResourceNode の継承と関連メソッドの定義
- パラメータ・マップを定義する
- リソース接続マップを定義する
- リソース型情報マップにクラスを登録する
- 備考:リソースの生成や接続に関連する実装はSim/Resource 内にある
- Sim/ResourceNode.h内の
PhysicalResourceNode
を継承する -
LoadParam()
/ReleaseParam()
をそれぞれコンストラクタとデストラクタで呼ぶ- 後で述べるパラメータ・マップ経由でパラメータの読み出しと保存が行われる
-
Initialize(InitPhase phase)
を実装する- このメソッドは初期化の段階に応じて複数回呼ばれる
-
phase
はINIT_PRE_CONNECTION
/INIT_POST_CONNECTION
が渡される -
INIT_PRE_CONNECTION
オブジェクトが生成された直後のタイミング -
INIT_POST_CONNECTION
:全てのオブジェクトの接続が完了した後のタイミング.
-
Finalize()
を実装する- このメソッドは,全てのオブジェクトが解放される直前のタイミングで呼ばれる.
- このメソッドが呼ばれた時点では接続されている全てのリソースはまだ生きているため,それらを参照した終了処理を行うことができる
-
リソースの入力パラメータやシミュレーション結果とXMLのマッピングを定義する
- 具体的には,クラス上の変数と入出力XMLのマッピングを行う
- 詳細は
ParamDB
,ParamExchange
の仕様を参照
-
以下は典型的なパラメータ・マップの例(
Fetcher
から抜粋)- 変数:
-
m_fetchWidth
はフェッチ幅(入力パラメータ) -
m_numFetchedOp
はフェッチされた命令の数(出力パラメータ)
-
- XML上の
Parameter/Fetcher/@FetchWidth
がm_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()
- リソースの生成と接続の情報は,Simulator/Configurations/ 以下のノードで定義される
- 以下では,このノードからトップダウンに各ノードの説明を行う
- 複数の定義ノード(名前は任意)を子に持つ
- 複数の定義ノードのうち,
Simulator/@Configuration
で指定されたノードが実際に使用される - デフォルトでは
DefaultConfiguration
が使用される - 外部からリソースの生成方法を変更したい場合は,新しい定義ノードを作成し,
Simulator/@Configuration
で指定すれば良い - 以下はデフォルトの状態の抜粋
- 複数の定義ノードのうち,
<Simulator Configuration='DefaultConfiguration'>
<Configurations>
<DefaultConfiguration>
<Constant>
...
/>
<Structure>
...
</Structure>
<Parameter>
...
</Parameter>
</DefaultConfiguration>
</Configurations>
...
</Simulator>
- ここでは便宜上,定義ノードを
<DefaultConfiguration>
とする -
<DefaultConfiguration>
は以下の要素を持つ-
<Constant>
- リソース生成時に使用する定数を定義
-
<Structure>
- リソースの生成と接続方法を記述
-
<Parameter>
- リソースに与える初期化パラメータを記述
-
-
<Structure>
内でリソースの生成数を指定する際に使用する定数を定義する - デフォルトでは以下の3つが定義されている
-
@ThreadCount
-
Copy
内のスレッド数
-
-
@CoreCount
-
Copy
内のコア数
-
-
@MemoryCount
-
Copy
内のメイン・メモリ数
-
-
-
Copy
についてはStructure
ノード内の説明を参照 - 以下はデフォルトの状態の抜粋
<Constant
ThreadCount='1'
CoreCount='1'
MemoryCount='1'
/>
- リソースの生成と接続の方法を定義する
-
Copy
以下の入れ子の構造が仮想的にCopy
の個数分存在していると考える- 後述の例を参照
- 適当な説明ですいません
<Structure>
<Copy Count='ThreadCount'>
<リソースのクラス名 Name='リソースのインスタンス名' Count='リソースの生成数'/>
...
</Copy>
</Structure>
-
Name
属性で指定された名前で,Count
属性で指定された個数のリソースを生成
<リソースのクラス名 Name='リソースのインスタンス名' Count='リソースの生成数'/>
- あるリソースが他のリソースを持つ構造を,XMLの入れ子によって表現
- '親'の持つ接続先変数に対し,子を接続する
<親クラス名 Name='親クラスのインスタンス名'>
<子クラス名 Name='子クラスのインスタンス名' To='接続先の変数名'/>
</親クラス名>
- 例
- 以下の例の場合,
Parent
クラスのparent.m_child
にChild
クラスのオブジェクト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>
<リソースの型
Name = 'リソースのインスタンス名'
パラメータ名 = '値'
/>
</Parameter>
- 例については,前述のパラメータ・マップの定義の項を参照