現在の位置
diff プラグインを使用中
- 追加された行はこの色です。
- 削除された行はこの色です。
- 仕様/その他/リソースの生成と接続 へ行く。
- 仕様/その他/リソースの生成と接続 の差分を削除
*はじめに [#i6729d0e] -"リソース"とは,物理的な資源(演算器,レジスタetc)を実装したクラスのオブジェクトを指す --Thread(ハードウェアスレッド) 等の一部例外はある -リソースの生成と接続は全てXML 上の定義に従って行われる -このページでは,以下の情報についてまとめる ++鬼斬のリソース生成・接続システムへの対応方法 ++生成・接続情報の定義 *リソースの実装方法 [#ed3e2189] リソースの実装手順は以下の通りである.本節ではこれらについて詳しく述べる. +PhysicalResourceNode の継承と関連メソッドの定義 +パラメータ・マップを定義する +リソース接続マップを定義する +リソース型情報マップにクラスを登録する -備考:リソースの生成や接続に関連する実装はSim/Resource 内にある **PhysicalResourceNode の継承と関連メソッドの定義 [#pb30be5f] -Sim/ResourceNode.h内のPhysicalResourceNode を継承する -LoadParam()/ReleaseParam() をそれぞれコンストラクタとデストラクタで呼ぶ --後で述べるパラメータ・マップ経由で,パラメータの読み出しと保存が行われる --後で述べるパラメータ・マップ経由でパラメータの読み出しと保存が行われる -Initialize(InitPhase phase) を実装する --このメソッドは初期化の段階に応じて複数回呼ばれる --phaseはINIT_PRE_CONNECTION/INIT_POST_CONNECTION が渡される --INIT_PRE_CONNECTION :オブジェクトが生成された直後のタイミング --INIT_POST_CONNECTION :全てのオブジェクトの接続が完了した後のタイミング. -Finalize() を実装する --このメソッドは,全てのオブジェクトが解放される直前のタイミングで呼ばれる. --このメソッドが呼ばれた時点では接続されている全てのリソースはまだ生きているため,それらを参照した終了処理を行うことができる **パラメータ・マップの定義 [#b42c1c3f] -リソースの入力パラメータやシミュレーション結果と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> *** パスの取得 [#wd85bbbd] -PhysicalResourceNode を継承したクラスでは,入出力パラメータのXML上位置は自動的に決まる -以下のメソッドを使用することにより,取得可能 --PhysicalResourceNode::GetParamPath() ---そのクラスのパラメータのパスを取得 --PhysicalResourceNode::GetResultPath() ---そのクラスの結果のパスを取得 **リソース接続マップの定義 [#d0d4d014] -C++上のオブジェクトへのポインタ変数とXML上での名前をマッピングする -具体的には,以下の3つのマッピングを行う ++ポインタ変数の型名 ---リソースの型名 ---C++ソース/XML 上で共通の名前を使用 ++XML上での名前 ---XML上から参照される際の変数名 ---XML上でのみ使用 ++リソース上の変数名 ---他のリソースへの参照を保持する変数の名前 ***書式 [#w5bff438] 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 ); ***例 [#pf878f96] リソースの実装: 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"のバインドを行っているとも言える **リソース型情報マップへのクラスの登録 [#jc1c3c15] -Sim/Resouce/ResourceMap.h 内のマップへ作成したクラスを登録する ***書式 [#d21b9be6] -RESOUCE_INTERFACE_ENTRY(インターフェース名) --インターフェース(抽象クラス)を登録する際に使用 -RESOUCE_TYPE_ENTRY(クラス名) --クラスを登録する際に使用 -例: BEGIN_RESOUCE_TYPE_MAP() RESOUCE_INTERFACE_ENTRY(EmulatorIF); RESOUCE_TYPE_ENTRY(CheckpointMaster) END_RESOUCE_TYPE_MAP() *生成・接続情報XMLのフォーマット [#lddbb0ae] -リソースの生成と接続の情報は,Simulator/Configurations/ 以下のノードで定義される -以下では,このノードからトップダウンに各ノードの説明を行う **<Configurations> [#f2be580c] -複数の定義ノード(名前は任意)を子に持つ --複数の定義ノードのうち,Simulator/@Configuration で指定されたノードが実際に使用される --デフォルトでは"DefaultConfiguration"が使用される --外部からリソースの生成方法を変更したい場合は,新しい定義ノードを作成し,Simulator/@Configuration で指定すれば良い --以下はデフォルトの状態の抜粋 <Simulator Configuration='DefaultConfiguration'> <Configurations> <DefaultConfiguration> <Constant> ... /> <Structure> ... </Structure> <Parameter> ... </Parameter> </DefaultConfiguration> </Configurations> ... </Simulator> **<DefaultConfiguration>(定義ノード) [#f625514a] -ここでは便宜上,定義ノードを<DefaultConfiguration>とする -<DefaultConfiguration>は以下の要素を持つ --<Constant> ---リソース生成時に使用する定数を定義 --<Structure> ---リソースの生成と接続方法を記述 --<Parameter> ---リソースに与える初期化パラメータを記述 **<Constant> [#q6855987] -<Structure>内でリソースの生成数を指定する際に使用する定数を定義する -デフォルトでは以下の3つが定義されている --@ThreadCount ---Copy内のスレッド数 --@CoreCount ---Copy内のコア数 --@MemoryCount ---Copy内のメイン・メモリ数 -Copy についてはStructure ノード内の説明を参照 -以下はデフォルトの状態の抜粋 <Constant ThreadCount='1' CoreCount='1' MemoryCount='1' /> **<Structure> [#y3d9059b] -リソースの生成と接続の方法を定義する -Copy以下の入れ子の構造が仮想的にCopy の個数分存在していると考える --後述の例を参照 --適当な説明ですいません <Structure> <Copy Count='ThreadCount'> <リソースのクラス名 Name='リソースのインスタンス名' Count='リソースの生成数'/> ... </Copy> </Structure> ***生成 [#fef22f74] -Name 属性で指定された名前で,Count 属性で指定された個数のリソースを生成 <リソースのクラス名 Name='リソースのインスタンス名' Count='リソースの生成数'/> ***接続 [#vfa59d93] -あるリソースが他のリソースを持つ構造を,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> を使用することも出来る.属性の構文は同じ ***例 [#u9f020e7] -以下の定義が存在した場合,図のようにリソースが生成,接続される <Copy Count='4'> <Core Count='2'> <Thread Count='4'> <L1Cache Count='2'> <L2Cache Count='1'/> </L1Cache> </Thread> </Core> </Copy> #ref(structure.png) **<Parameter> [#bb430ec8] -リソースの初期化パラメータを定義する <Parameter> <リソースの型 Name = 'リソースのインスタンス名' パラメータ名 = '値' /> </Parameter> -例については,前述のパラメータ・マップの定義の項を参照