ログのフォーマット - onikiri/onikiri2 GitHub Wiki
プロセッサのパイプラインの状態を可視化するツール.鬼斬のトップページにあるスクリーンショットのようなパイプラインチャートを見ることができる.
- 鬼斬側
-
- VizualizationDumper がログを出力(.log/.log.gz)
-
- Kanata側
-
- KanataPP が .log ファイルを .kanata ファイルに変換
-
- Kanata が .kanata ファイルを解釈して表示
-
Kanata は .log ファイルを渡されると KanataPP を自動的に呼び出すため,通常は2. を意識することはない.
- 鬼斬側でログを出力しているのは VizualizationDumper
- KanataPP の LogConverter.cs の中でログを .kanata に変換
- ログはテキスト形式であり,1行ごとにコマンドとその引数がタブ区切りで並んだ形式をとる
- 各サイクルごとに,プロセッサ内で起きたイベント(フェッチとかリネームとかディスパッチとか)を出力する
- ログファイル内の時間は先頭から末尾に向けて一方向に進む
- 一度未来のデータを出力してしまった場合,過去に起きたイベントを追加することはできない
ファイルの先頭行は Kanata ファイルであることを表すヘッダと,ファイルのバージョンを格納する.現在のファイルのバージョンは4であり,たとえば以下の様になる
Kanata 0004
...
ヘッダ以降はログの本体であり,1行ごとに1命令の動作を表すコマンドを格納する. 各行の基本フォーマットはおおよそ以下のようになる.
- 各行は,文字列をタブで区切った複数の列からなる
- 1列目はコマンド
- 2列目以降は可変個のパラメータであり,コマンドに従って解釈される
典型的には以下のようになる
commandA param0 param1 ...
commandB param0 ...
多くの場合,第1パラメータ(param0)は命令のIDである
各コマンドはファイル内で一意のIDを指定して,コマンドの対象を指定する.このIDは後述するLコマンドの第二引数で指定されるものである.
各命令は複数のパイプラインの進行状態を持つ事ができ,それらをオーバーレイして表示できる.たとえば,通常のパイプラインの進行の上にストール状態をオーバーレイすることができる.
この時のレイヤーをレーンと呼び,SやEコマンドの第二引数で指定する.デフォルトでは,レーン0は通常のパイプライン,レーン1はストールを出力するようになっている.
- シミュレーション開始からの経過サイクル数を指定する
C= <Cycle>
* Cycle はシミュレーション開始からログ開始時点までの経過サイクル数.
C= 7
* 通常,ヘッダ行の次に現れる
* Kanataの表示には反映されない
- 前回ログ出力時からの経過サイクル数を指定
C <Cycle>
- Cycle: 経過サイクル数
C 1
* 次のC行が現れるまでのコマンドは全てこのタイムドメインに属する
* 大体毎サイクル何かしらコマンドが出力されるので、C 1ばかりになる
- 特定の命令に関するコマンド出力の開始
- 使用例:
I 0 0 0
- 命令に関するコマンドを出力する前にこれが必要
- ファイル内に新しい命令が初めて現れた際に出力
- 2列目はファイル内の一意のID
- ファイル内で現れるたびに振られるシーケンシャルなID
- 基本的に他のコマンドは全てこのIDを使って命令を指定する
- 3列目は命令のID
- シミュレータ内で命令に振られているID.任意のIDが使える
- 4列目はTID(スレッド識別子)
- 命令に任意のラベルをつける
- 命令が生きている期間は任意のラベルをつけることができる
- Lが複数回実行された場合,前回までに設定したラベルに追記される
L <ID> <Type> <Label Data>
- ID
- ファイル内の一意のID
- Type
- ラベルのタイプ
- 0: ビジュアライザ左に直接表示されるラベル.通常はPCと命令,レジスタ番号など
- 1: マウスオーバー時に表示される詳細.実行時のレジスタの値や使用した演算器など
- ラベルのタイプ
- Label Data
- 任意のテキスト
L 0 0 120047734: r1 = iALU( r16 )
ステージ開始
S <ID> <Lane> <Stage Name>
- 2列目は命令のID
- 3列目はレーンのID
- 4列目はステージ名
- onikiri2側で新しいステージを勝手に追加しても大丈夫
S 0 F
ステージ終了
E <ID> <Lane> <Stage Name>
- 2列目は命令のID
- 3列目はレーンのID
- 4列目はステージ名
E 0 F
特定の命令に関するコマンド出力の終了
R <ID> <Retire ID> <Type>
- フラッシュの場合もリタイアの場合もRを出力する必要がある
- 2列目は命令のID
- 3列目はリタイアID
- フラッシュされずにリタイアされた命令に対して一意となるID
- onikiri2はフラッシュされる命令にも投機的にリタイアIDを振るため,リタイアIDは重複する場合がある
- 4列目はリタイア/フラッシュの識別
- 0ならリタイア
- 1ならフラッシュ
R 4 4 0
- 任意の依存関係
- 典型的にはウェイクアップ
- タイプ番号の指定により,違う色で表示される
W <Consumer ID> <Producer ID> <Type>
- 2列目はコンシューマーのID
- 3列目はプロデューサーのID
- 4列目は依存関係のタイプ
- 0ならウェイクアップ
- 1以降は今のところ予約
- コンシューマーが生きている期間のみ使用可能
W 1 0 0
Kanata 0004 // 0004 バージョンのファイル
C= 216 // 216 サイクル目から開始
I 0 0 0 // 命令0の開始
L 0 0 12000d918 r4 = iALU(r3, r2) // 命令0にラベル付け
S 0 0 F // 命令0のFステージを開始
I 1 1 0 // 命令1の開始
L 1 0 12000d91c iBC(r17) // 命令1にラベル付け
S 1 0 F // 命令1のFステージを開始
C 1 // 1サイクル経過
E 0 0 F // 命令0のFステージ終了
S 0 0 Rn // 命令0のRnステージ開始
E 1 0 F // 命令1のFステージ終了
S 1 0 Rn // 命令1のFステージ開始
(文責:堀尾,改訂:塩谷)