ログのフォーマット - onikiri/onikiri2 GitHub Wiki

ログのフォーマット

はじめに

Kanata とは

プロセッサのパイプラインの状態を可視化するツール.鬼斬のトップページにあるスクリーンショットのようなパイプラインチャートを見ることができる.

処理の流れ

  • 鬼斬側
      1. VizualizationDumper がログを出力(.log/.log.gz)
  • Kanata側
      1. KanataPP が .log ファイルを .kanata ファイルに変換
      1. 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=

  • シミュレーション開始からの経過サイクル数を指定する

フォーマット:

C=	<Cycle>
* Cycle はシミュレーション開始からログ開始時点までの経過サイクル数. 

使用例:7サイクル目から開始

C=	7

備考:

* 通常,ヘッダ行の次に現れる
* Kanataの表示には反映されない

C

  • 前回ログ出力時からの経過サイクル数を指定

フォーマット:

C	<Cycle>
  • Cycle: 経過サイクル数

使用例:1サイクルが経過

C	1

備考:

* 次のC行が現れるまでのコマンドは全てこのタイムドメインに属する
* 大体毎サイクル何かしらコマンドが出力されるので、C	1ばかりになる

I

  • 特定の命令に関するコマンド出力の開始
  • 使用例:
I	0	0	0
  • 命令に関するコマンドを出力する前にこれが必要
    • ファイル内に新しい命令が初めて現れた際に出力
  • 2列目はファイル内の一意のID
    • ファイル内で現れるたびに振られるシーケンシャルなID
    • 基本的に他のコマンドは全てこのIDを使って命令を指定する
  • 3列目は命令のID
    • シミュレータ内で命令に振られているID.任意のIDが使える
  • 4列目はTID(スレッド識別子)

L

  • 命令に任意のラベルをつける
    • 命令が生きている期間は任意のラベルをつけることができる
    • Lが複数回実行された場合,前回までに設定したラベルに追記される

フォーマット:

L	<ID>	<Type>	<Label Data>
  1. ID
    • ファイル内の一意のID
  2. Type
    • ラベルのタイプ
      • 0: ビジュアライザ左に直接表示されるラベル.通常はPCと命令,レジスタ番号など
      • 1: マウスオーバー時に表示される詳細.実行時のレジスタの値や使用した演算器など
  3. Label Data
    • 任意のテキスト

使用例:

L	0	0	120047734: r1 = iALU( r16 )

S

ステージ開始

フォーマット

S	<ID>	<Lane>	<Stage Name>
  • 2列目は命令のID
  • 3列目はレーンのID
  • 4列目はステージ名
    • onikiri2側で新しいステージを勝手に追加しても大丈夫

使用例:

S	0	F

E

ステージ終了

フォーマット

E	<ID>	<Lane>	<Stage Name>
  • 2列目は命令のID
  • 3列目はレーンのID
  • 4列目はステージ名

使用例:

E	0	F

R

特定の命令に関するコマンド出力の終了

フォーマット

R	<ID>	<Retire ID>	<Type>
  • フラッシュの場合もリタイアの場合もRを出力する必要がある
  • 2列目は命令のID
  • 3列目はリタイアID
    • フラッシュされずにリタイアされた命令に対して一意となるID
    • onikiri2はフラッシュされる命令にも投機的にリタイアIDを振るため,リタイアIDは重複する場合がある
  • 4列目はリタイア/フラッシュの識別
    • 0ならリタイア
    • 1ならフラッシュ

使用例:

R	4	4	0

W

  • 任意の依存関係
    • 典型的にはウェイクアップ
    • タイプ番号の指定により,違う色で表示される

フォーマット

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ステージ開始

(文責:堀尾,改訂:塩谷)

⚠️ **GitHub.com Fallback** ⚠️