XMPSIM ユーザ・マニュアル 和訳:たけおか しょうぞう http://www.takeoka.org/~take/ 和訳 第1版 2008/APR/30 §1: はじめに この付録(※訳注:この文書は、参考文献2「The Cray X-Mp/Model 24: A Case Study in Pipelined Architecture and Vector Processing 」の付録として書 かれたものを、そのまま配布物としていると思われる)では、学生や科学者 がCrayアセンブリ言語(CAL)プログラムの断片を、安価に、ユーザ・フレンド リに、対話環境でテストしたり実行したりできるような、Cray X-MPの1プロセッ サのシミュレータについて記述した。 シミュレータはGanttチャート形式でタイミング・ダイアグラムを生成し、明 示的に機能ユニット(シミュレータのDユニットを参照)とポートの命令の流れ を表示する。これは、ベクトル処理を教えるツールと、機械命令の並列の性能 と効果を解析するテストベッドとして、設計されている。 シミュレータはCrayアセンブリ言語のソースコードを処理する。 定番としては、Cray Fortranコンパイラに生成させたアセンブリ言語の出力を得 て、少し編集し、それをシミュレータで性能解析のために走行させる。 シミュレータの設計とタイミングはCray X-MPシリーズ・メインフレーム・リ ファレンス・マニュアル[1]にある仕様に基づいている。そしてプログラムは Cray X-MP モデル24で走行した結果によるものを出している。 XMPSIM配布ディスクは、最新の更新と機能ドキュメントが載ったREADME.DOCファ イルを含んでいる。 §2 : シミュレータ基本操作 XMPSIMは、IBM AT互換機で動作する。 シミュレータが起動されると、 シンボル・テーブルを作成し埋めるために、2つのパスを実行する。 シミュレータは 同時にシンボル・テーブル、アセンブリ・コード、エラー情報を含む リスティング・ファイルを作成する。 プログラムそのものは、プログラム実行中である一部が命令バッファに入っている ことを除いて、ディスクに保持されるが、プログラム・データはメモリに保持 される。 デフォールトのコンフィギュレーションでは、XMPSIM CALインタープリタは 初期化後、シングル・ステップ・モードで起動する。 シングル・ステップ・モードでは、 毎クロック・サイクルが完了するごとに状態が再表示される。 ユーザは、次の命令の実行を始めるために、スペースバーを押さなければならない。 XMPSIMは、連続した実行を行うこともでき、それはCALソース命令をキーボー ドのキーが押されるか、ブレークポイントに出会うまで、連続した実行を行 う。 XMPSIMがシングル・ステップ・モードでないとき、ユーザは、毎クロック・サイクル後 に、状態の再表示を行うかの選択ができる。 シミュレータは、実行中の機械の状態を、画面の上部に、ユーザが設定可能な 6つのウインドウに表示する。制御メニューは下部にある。許される表示オプ ションと、表示ボックス中の個々のフィールドの意味は、次の節で述べる。 ユーザは、プログラム断片を通してシングル・ステップするか、または、ブレー クポイントを設定して、ユーザの指定した条件が発生した時に実行を停止する かを選べる。 ブレークポイントのトリガとして許される条件には、実行時間リミット、命令 の繰り返し回数、NIPフル、ホールドがクリアされた、バンクかラインの衝突 が含まれる。 各シングル・ステップごとに、 表示ウインドウを変化させるオプションをユーザは持つ。 ポートと各DUnitの使用率、命令発行の平均レート、メモリ衝突の回数、チェイ ンニングの起きた総数、プログラム断片のMFLOPs数を含む、プログラムの 統計情報が保持されている。 §3: シミュレータの起動 シミュレータは次のコマンドで起動される: xpsim 入力ファイル 出力ファイル ここで、入力ファイルは、先の節で議論した、CALソース・コードを持ったファ イルの名前である。 出力ファイルは、シミュレータ・アセンブラによって生成されたCALリスティ ング・ファイルと、シミュレータ運用のログを含んでいる。 入力ファイルのデフォールトの拡張子は、「.IN 」であり、出力ファイルのデ フォールトの拡張子は、「.OUT」である。もし、出力ファイルが省略されたら、 入力ファイルの名前が拡張子「.OUT」と供に使用される。 §4: ソース・プログラムの作成 シミュレータを起動する前に、シミュレータの入力ファイルとして使用される CALソース・プログラムを作成しなければならない。 CALソース・プログラムは「START」指令から始まらなければならない。 START指令は、プログラムの開始命令を示すラベル引数をとる。 このラベルは分離された行で、プログラムの実行コードの最初の行の前に、 「 = *」を後ろにつけて、現れなければならない。 START label * * データと他の指令はここから始めることができる * label = * プログラム ENDP EXEC *,* * * また、データと他の指令はここから始めることができる * END コメント行は「*」を1カラム目に持つ。EXEC指令はシミュレータに実行される 命令の最大個数と、ジャンプが取られる最大数を指定する。 この指令の、数値引数が置かれるべき場所にある「*」は、値にとくに制限をつけない ことを意味する。 いくつかのCAL入力ファイルのサンプルが、配布ディスクに含まれている。 ベクトルに定数の加算を行う、CALプログラムのサンプルは以下のようである。 START abcxyz ADAT1 DATA 123 DATA 125 DATA 10 DATA 11 DATA 12 DATA 12 DATA 12 DATA 12 abcxyz = * S1 RT S2 8 A0 ADAT1 A1 9 A2 A1-1 VL A2 V1 ,A0,1 V2 S2+V1 S3 V2,A2 S4 RT ENDP EXEC *,0 END CALアセンブリ言語命令と並んで、ソースコードには、指令(や擬似命令)とオ プション・リストが含まれている。 指令は: End 入力ファイルの最後の印 EndP プログラムの最後の印。EndPの後の命令は、シミュレータによって実行 されない。データが置かれるだろう。 Exec n,m n個の命令とm個のジャンプ命令に実行を制限する。 数値が置かれるところに*がある場合、 命令が実行される数とジャンプの取られる数に制限が無いことを示す。 Data n,m m語のメモリを予約し、各番地をnで初期化する。 値nは、整数かrealのどちらかである。 もし、mが省略されたら、1語がメモリに予約され、初期化される。 InitA n,m Aレジスタnを値mに初期化する。 もし、nが*なら、Aレジスタの全てが初期化される。 InitB n,m Bレジスタnを値mに初期化する。 もし、nが*なら、Bレジスタの全てが初期化される。 InitS n,m Sレジスタnを値mに初期化する。 もし、nが*なら、Sレジスタの全てが初期化される。 InitT n,m Tレジスタnを値mに初期化する。 もし、nが*なら、Tレジスタの全てが初期化される。 InitV n,m Vレジスタnを値mに初期化する。 もし、nが*なら、Vレジスタの全てが初期化される。 InitV0 n,m V0レジスタの要素nを値mに初期化する。 InitV1 n,m V1レジスタの要素nを値mに初期化する。 InitV2 n,m V2レジスタの要素nを値mに初期化する。 InitV3 n,m V3レジスタの要素nを値mに初期化する。 InitV4 n,m V4レジスタの要素nを値mに初期化する。 InitV5 n,m V5レジスタの要素nを値mに初期化する。 InitV6 n,m V6レジスタの要素nを値mに初期化する。 InitV7 n,m V7レジスタの要素nを値mに初期化する。 後ろにオプション・リストを持つOPTIONS指令 を使用することで、 シミュレータのオプションのリストを指定することができる。 オプション・リストの形式は: オプション1 オプション2 オプション3 ... 各オプションjは、形式 「文字列n,m」 を持つ。ここで、nとmはオプショナルな数値 (ここでは、n, mは省略されているだろう)。許されるオプションは: M m メッセージ・レベル抑制 - 表示するメッセージの深刻さを示す。もし、nが 省略されるか0なら、全メッセージが表示される。デフォールトの動作は、全 メッセージを表示。 SB 命令バッファが満たされる間、シングル・ステップ動作をスキップ。 B n デフォールトの、long整数の、表示の基数(display base)をnとする。 LB n,m 行ブレークポイント(line breakpoint)を行n、スキップ値をmに設定。 RTCBP n クロック・ブレークポイントをn回目に設定。 NS 動作モードを、表示ありのノー・シングル・ステップに設定。 NSD 動作モードを、表示無しのノー・シングル・ステップに設定。 ILIST n 保存された命令のリストのサイズの最大値をnに設定。 nの最大値は992でデフォールトは100。 TOKEN 出力ファイル中に、命令をトークンに復号したものを含める。 LIST 出力ファイル中に、リスティング・ファイルを含める。 SHOWAI Aレジスタの初期値を出力ファイル中に提示する。 SHOWAF Aレジスタの最終値を出力ファイル中に提示する。 SHOWSI Sレジスタの初期値を出力ファイル中に提示する。 SHOWSF Sレジスタの最終値を出力ファイル中に提示する。 SHOWMI メモリの初期値を出力ファイル中に提示する。 SHOWMF メモリの最終値を出力ファイル中に提示する。 SHOWSTAT 統計情報の最終値を出力ファイル中に含める。 SHOWTOKENS トークンのリストを出力ファイル中に含める。 SHOWCONST 定数のリストを出力ファイル中に含める。 SHOWBUF 命令バッファの内容を、それらが詰められたように、 出力ファイル中に提示する。 SHOWEXE 各命令をそれが実行されたように、出力ファイル中に提示する。 §5: Cray X-MPの命令サイクル 与えられた命令の 命令サイクルは3つのフェーズを持つ[1]。 フェッチ・フェーズ、命令は命令バッファから「次命令パーセル・レジスタ (Next instruction parcel register: NIP)」に送られる。 Cray X-MPは、プログラムについてはキャッシュのように働く、256Bytesの命 令バッファを4つ持つ。 もし命令が命令バッファに見つからなければ、バッファが満たされことができ るようになるまで、プログラムは遅延されるだろう。 次のフェーズでは、 命令がNIPから「現在の命令パーセル・レジスタ (current instruction parcel register: CIP)」に移され、 そこでデコードされる。 CIPは他の機械の命令レジスタと同等である。 Cray X-MPの命令は、1パーセル(2Bytes)か2パーセル(4Byes)の長さである。 2パーセル命令の2番目のパーセルは、「低命令パーセル・レジスタ(lower instruction parcel register: LIP)」に移される。 もし命令の実行が始めることができれば、適切な機能ユニットに命令は送られ る。そうでなければ、実行の衝突が解決されるまで、命令はCIPに残される。 1パーセル命令は、それがCIPから開放されたときに、発行(issue)されたと言わ れる。2パーセル命令は、2番目のパーセルがLIPから開放されたときに、発行 されたと言われる。 シミュレータはGanttチャートを生成する(命令番号 vs 時間) Ganttチャートは、命令サイクルの3つの全フェーズを見せる。 例として、セクション4のCALプログラム断片の 出力テーブルと、Ganttチャートは、次のとおり: List of Issued Instructions Follows: \# Parcel Line NIP CIP LIP Issue Start End Opcode Instruction 1 10a 11 16 17 - 17 18 18 072100 S1 RT 2 10b 12 17 18 18 19 20 20 040200 000010 S2 8 3 10d 13 19 20 20 21 22 22 020000 000000 A0 ADAT1(M0) 4 11b 14 21 22 - 22 23 23 022111 A1 9 5 11c 15 22 23 - 23 24 25 031210 A2 A1-1 6 11d 16 23 24 - 25 26 26 002002 VL A2 7 12a 17 24 26 - 26 27 51 176100 V1 ,A0,1 8 12b 18 26 27 - 27 28 56 154221 V2 S2+V1 9 12c 19 27 28 - 56 57 60 076322 S3 V2,A2 10 12d 20 28 57 - 57 58 58 072400 S4 RT 1: NCE 2: .NLLE 3: ...NLLE 4: .....NCE 5: ......NCEe 6: .......NCcE 7: ........NnCEEEEEEEEeEEEEEEEEEeEEEEEE 8: ..........NCEEEEEEEeEEEEEEEEEeEEEEEEEEEeE 9: ...........NCCCCCCCcCCCCCCCCCcCCCCCCCCCcCEEEE 10: ............NNNNNNNnNNNNNNNNNnNNNNNNNNNnNCE } Gantt chart starts at time 16 and ends at time 60. 命令がNIPに入っている時間は、Nとして印がついている。CIPの間の時間は、C と印付けされる。もし命令がLIP中にパーセルを持つときは、Lと印付けされる。 実際の実行サイクルはEとして印付けされる。 小文字は読み易さのために、10サイクル毎に使用される。 もし命令の実行に必要な資源がすでに使われているならば、 現在、CIPに入っている命令は遅延されるか、資源が使用可能になるまでホー ルド(保持)される。 起こりえる資源の競合は、いくつかのソース(※訳注:演算のソース)から 発生しえる。 ベクトル命令は、命令の実行期間はそのオペランドの入力と出力を予約する。 同様に、ベクトルDユニットは、ベクトル操作のすべての要素がDユニットのパ イプラインに入りきるまで、使用中となる。 いくつかの命令(スカラ・メモリ参照とチェインされたベクトル操作) は、実 行に必要なすべての資源が開放される前に、発行することを許される。 § 6: メイン表示 シミュレータのメイン表示は、機械の状態情報が表示される複数の窓から成る。 デフォールトのコンフィギュレーションでは、6つの窓があり、しかし、EGAグ ラフィック・アダプタと強化型カラーモニタなら9つの窓の表示を選択できる コマンド・ボックスは、シミュレータ表示の画面の下方を占める。 ボックスの最終行には、シミュレータのメイン表示のメニューがある。 ボックスの他の行は、シミュレータが実行中のエラーと状態情報を示す。 画面の最下部のメニューは次を与え: Waiting for a key (M, S, W, N, B, Q, D, H, ? (for help), other) キーは、大文字でも小文字でもいい。 キーの解釈は、 M メイン・コンフィギュレーション・メニューを表示し、ユーザは表示窓の解 釈と他のパラメータを変更できる。 S レジスタの値を表示し、ユーザはそれを変更できる。 W あるレジスタをウォッチ(監視)するために、レジスタ表示ボックスを設定す る。もし、レジスタがRegisterDisplayListにすでにあれば、それは取り除か れる。そうでなければ、リストの末尾に加えられる。RegisterDisplayListの 最初の8つのレジスタは、レジスタ・リスト1に表示され、次の8つはレジスタ・ リスト2に表示され、以下同様。 N シングル・ステップを止める。連続実行モードで実行されている最中の命令 を表示することを選べる。 B ブレークポイントをセット、またはクリアする。 Q シミュレータの実行を終了する。 D 表示の基数を指定した整数にする。 H ホールドが無くなるまで走行する。 ? ヘルプ表示 その他 実行の次のクロック・サイクルを行う。 § 7: コンフィギュレーション・メニュー Mコマンドを選択することによって、ユーザはメイン・コンフィグレーション・ メニューに入る。コンフィギュレーション・メニューでは、各シミュレーショ ン表示ボックスに表示される資源と、使用されるモニタの型を指定することが できる。 ボックスに表示される情報を指定するには、まずカレント・ボックスを決めな ければならない。カレント・ボックスはカラーか二重の外枠(※訳注:日本語 DOS窓では半角「ヘ」)で表示されている。どのボックスをカレント・ボックス にするか変更するために、キーパッド上の矢印キーを使用する。設定したいボッ クスを一旦選んだら、スペースバーを押下することで、そのボックスのための 表示オプションをスクロールしていくことができる。望む表示オプションがカ レント・ボックスに現れたら、作業は終わり。他のボックスへ移動するために 矢印キーを使用するか、「リターン」キーを押下してコンフィギュレーション・ メニューから出る。 表示ボックスとできるのは、以下: a. NIP, CIP, and LIP NIP, CIP, LIP レジスタの内容と状態を表示。表示されるレジスタの値は、 ソース・アセンブリ言語命令のまさに保持されているものである。2パーセル 命令の2番目のパーセルを保持し、そうでない場合は空であるLIPは明示的には 表示されない。その代わり、CIPが2パーセル命令を保持し、LIPがレディなら、 CIPに星(「*」)が付く。 加えて、このボックスは時刻(RTC)、プログラム・アドレス・レジスタ(PC)、 ベクトル長レジスタの現在値(VL)、ベクトル・マスク・レジスタの現在値(VM)、 現在の命令のソース上の行番号(Line)、現在の命令バッファの数(Buffer) を 表示する。 (※メモ:Bufferってなんだろう???) b. Aレジスタ(A Registers) Aレジスタ全部の現在の値を表示する。 Aレジスタが予約されていると、その名前に「*」が付く。 レジスタが初期化されていないと、その値は「undefined(未定義)」と表示される。 値は、Dオプションで設定された基数で表示される(デフォールトは10)。 c. Sレジスタ(S Registers) Sレジスタの現在の値と状態を表示する。 もし値が整数なら、Aレジスタで使用されているのと同様な形式で表示される。 しかし、Sレジスタは64bit幅であるから、ボックスにより与えてられているス ペースより、値の幅の方が大きいこともあるだろう。このケースでは、上位桁 の部分が表示され、後ろに「+」が付き、その部分の数は省略される。 整数値は、Dオプションで設定された基数で表示される(デフォールトは10)。 もし、Sレジスタの値が浮動小数点数なら、6桁の仮数部が表示される。(もし、 あるレジスタの全部の桁を見たいならば、メイン・メニューのSコマンドを使 用するべし) d. アクティブ・ポートとDユニット(Active Ports and DUnits) 現在アクティブなポートと機能ユニットのリストを表示する。ポートは上位の ボックスに表示され、機能ユニットは下位のボックスに表示される。 e. Dユニット(DUnits) 選ばれたベクトル機能ユニットの組の状態と、現在のアクティビティを表示す る。ベクトル機能ユニットのどの組でも選択できる。 選択ボックスに、機能ユニット表示オプションが現れたら、 画面の最下部に付加メニューが現れる。 大文字「D」は上位ボックスに設定したい機能ユニットをスクロールさせ、 小文字「d」は下位ボックスに設定したい機能ユニットをスクロールさせる。 機能ユニットの組のボックスが最大4つまで表示される。 もし機能ユニットが予約されていたら、名前の前に「*」が付く。 各機能ユニットで表示される他の値は次である: SU セットアップ時間 -最初のオペランドが機能ユニットに送り込めるようになるまでに要する時 間を示す。この時間は、セットアップ中は、0に向かってカウントダウンされ る。 SD シャットダウン時間 - 最後のベクトル要素操作のオペランドが機能ユニットのパイプに入った後 に、機能ユニットが再利用可能になるまでの時間を示す。 命令は実行され続ける。 Index Current (現在のインデックス) - 進行中のベクトル操作のオペランドのインデックス Left (残り操作数) - ベクトル命令で実行されるべき、残りの操作の数 DT 終了時間(Done time) - 機能ユニットが他のアクティビティの開始のためにフリーになる時刻を示す。 IT 発行時間(Issue time) - 現在実行中の命令が発行された時刻を示す。 f. ポート(Ports) ポートの状態とアクティビティを表示する。 もしポートが命令バッファを埋めるためにサスペンドされたら、ポート名の前 に「+」が付き、ポートが予約されている間はポート名の前に「*」が付く。 各ポートのために表示される他の値は次である: SU セットアップ時間(Setup time) - 最初のオペランドがポートに送り込めるようになるまでに要する時間を示 す。この時間は、セットアップ中は、0に向かってカウントダウンされる。 SD シャットダウン時間 - 最後のベクトル・メモリ操作が開始された後、ポートが再利用可能になる までの時間を示す。 命令は実行され続ける。 Index (インデックス) - 進行中のベクトル・メモリ操作のオペランドのインデックスの現在値。 Left (残り操作数) - ベクトル命令で実行されるべき、残りの操作の数 DT 終了時間(Done time) - ポートが他のアクティビティの開始のためにフリーになる時刻を示す。 IT 発行時間(Issue time) - 現在実行中の命令が発行された時刻を示す。 Addr (アドレス) - 現在の参照のメモリ・アドレス Bank - 現在の参照のバンク番号 Line - 現在の参照の行番号 Stride - 進行中のベクトル・メモリ操作の参照加算の空け具合。 (※訳注:ベクトル・メモリ操作は、メモリを参照するときに、一定の間隔 を飛ばしながら参照できる。その「飛ばし幅」のことを「Stride(ストライド)」 という) Holds (ホールド) - そのポートについての、これまでのホールド(バンク、ライン、ポート・ ビジー) の合計数。 Cycles (サイクル) - ポートがアクティブになった期間の総サイクル数。 Activity Type (アクティビティ型) - このサイクル中での、ポートのアクティビティの型の記述、バンク競合、 ライン競合、入力待ちによるサスペンド、など。 g. レジスタ・リスト (1から5) 5個までの表示窓をレジスタ値かメモリ値の表示に設定することができる。8 個までのメモリ番地かレジスタ(ベクトルの場合は、レジスタ要素) を、どの 窓にでも表示できる。 各レジスタの予約状態は、その名前の前の一文字で示される。 その文字は次の通り: 空白 予約無し * 資源は予約済み。ベクトル・レジスタの場合、レジスタはソースとして予 約済み。デスティネーションではない。 + ベクトル・レジスタがデスティネーションとして予約済み。 個別なこのベクトル要素が予約済みであり、チェインには使えない。 - ベクトル・レジスタがデスティネーションとして予約済み。 監視中のベクトル要素は予約済みではなく、チェイン操作のソースとして使 用可能である。 レジスタ・ディスプレイ窓にレジスタを増減するのは、W(ウオッチ)コマンド で、いつでもできる。 h. イベント(Events) イベント・リストからの多くのイベントの表示は表示ボックスにフィットさ せられるだろう。一度に16個までのイベント(時間が大きすぎないとして)を表 示できる。イベント・リストはイベント時間の大きくなる順番で維持される。 よって、もっとも最近に発生したイベントが、イベント・リストの始めの方に ある。 The event list is maintained in increasing order by event times, so the events which will occur the soonest are at the beginning of the event list. イベントは、資源(名前と番号)とイベントの発生した時刻を示すことで表示される。 イベントは、通常、資源の予約がなくなるであろう時刻を表現する。 i. ブレークポイント(Breakpoints) 現在のブレークポイントを表示。 ブレークポイントは、シミュレータを連続操作モードから抜けて、 シングル・ステップ・モードに入らせる。 ユーザは、プログラム実行の制御のためにブレークポイントを設定する。 これらのユーザが設定可能なブレークポイントはリストとして保持される。 次の型のブレークポイントを設定可能である: R 実時間クロック(RTC) - クロックが、指定した時刻になったら止まる N NIP - NIPが空になったら止まる(命令バッファが満たされるまでスキップするた めに使用される) L 行(Line) -ソースコードの行番号で指定された命令に達したら止まる。ブレークポイ ントを引き起こす前に、その命令を何回実行するかを指定することができる。 H ホールド(Holds) -すべてのホールドがクリアされたら止まる。 B バンク(Banks) - バンクかラインの競合があれば止まる。 j. 統計要約 (Statistics Summary) このクロック・サイクルまでの、実行の積算された統計値の 要約が表示される。 統計情報は次のとおり: Issues(発行) - (1番目か2番目のパーセルで)発行が起こったサイクル数の総数と、総サ イクル数に対する発行発生のパーセンテージ。 MFlops - プログラムのスタートから実行されたものが、1秒あたりに浮動小数点操 作が何百万回行えたか Chaining (チェイン) - ポートか機能ユニットがブロックされてチェインができなかった回数の 合計と、それの、ポートかDユニットがチェインできようとした総回数に対す るパーセンテージ。(注意: セットアップ時間は、これらのカウントに含まれ ない) DUnit (Dユニット) - ベクトル機能ユニットが操作を実行しようとして、競合によりブロックさ れた回数の合計と、それの、ベクトル機能ユニットが操作を実行しようとした 総回数に対するパーセンテージ。チェインの競合と命令発行を妨げるホールド が含まれている。 Port (ポート) - 操作を実行しようとして、競合によりポートがブロックされた回数の合計 と、それの、ポートへ操作を実行しようとした総回数に対するパーセンテージ。 チェインの競合、ポートにおけるバンクかラインの競合、命令発行を妨げるホー ルドが含まれている、が、命令バッファ・フィルは含まれていない。 Bank (バンク) - バンク競合が実行をブロックした回数の合計と、それの、バンクが使用中 であった総回数に対するパーセンテージ。 Line (ライン) - ライン競合が実行をブロックした回数の合計 と、それの、ラインが使用中であった総回数に対するパーセンテージ。 コンフィギュレーションをファイルに恒久的にセーブするオプションがある。 XMPSIMは、実行開始時に、コンフィギュレーション情報を「DEFAULT.FIL」か ら読む。あなたはコンフィギュレーションを直接「DEFAULT.FIL」にセーブす ることができる。または、セーブ時に他のファイル名を与えておき、あなたが 使用したいときにそのコンフィギュレーション・ファイルの名前を変えるとい うことができる。 §8: アセンブリ・フェーズの説明 Crayアセンブリ言語命令は1パーセル(2Bytes)か2パーセル(4Bytes)長である。 プログラム・アドレス・レジスタ(PC)はパーセルのカウンタである。 メモリ・アドレスが本当にワードのカウンタであり、PCよりも2bit短いのに対して。 このPCアドレスと他のアドレスとの違いは問題にならない。PCは、メモリの ワードではなく、命令バッファ中のパーセルを参照するからである。 XMPSIMはCALソース・コードをトークンに変換し、結果のトークンのリストか らそれをデコードすることによって、アセンブルする。アセンブリ・フェーズ の間、コードは、アセンブルされた形式では、実際にストアされることは無い。 ソース・コードは必要な時に、毎回、入力ファイルからアクセスされる。この 選択は、アセンブリ言語コードにメモリの制限を無くすという利点がある。実 行中は、命令のブロック(128パーセル)が、ソース入力ファイルから読まれ、 アセンブルされ、そして、命令バッファにアセンブル済み形式で格納される。 もし命令カウンタが命令バッファに無い命令を参照したら、out-of-buffer(バッ ファの外だよ)状態が引き起こされ、別の命令バッファが命令のブロックで満 たされなければならない。(ブロックはちょうど32ワード境界で始まらなけれ ばならない) アセンブラは、各ブロックの先頭のソース・コード上の行番号を 与えるBlockLineListを生成する。命令バッファを満たす時に、ディスクから 読むべきソース・コードの部分を決定するために、BlockLineListはシミュレー タによって使用される。 4つの命令バッファがあり、シミュレータは、バッファを満たすのに、Cray X-MPと同じアルゴリズムを使用する。 実行を開始する前に、アセンブラはCALソース・コードにいくつかのパスを適 用する。 パス0では、ソース・コードはラベルのために走査される、そして、それらは ラベルが定義された命令のソース行番号と供にLabelListに入れられる。同時 にDATA指令によって予約されたメモリの総量が決定され、メモリがアロケート される。(XMPSIMはメモリを、ヒープ上にアロケートする。全部で64Kバイトが あるヒープ) パス1では、パーセル番号値がラベルのために、LabelListに入れられる。 また、BlockLineListもこのパスの間に生成される。 メモリの値は、格納される。 パス1.2は通常は省略される。それは、アセンブル済み命令をトークン化され た形式で表示し、デバッグ用途に使用できる。 パス1.5はデフォールトで省略される。それはリスティング・ファイルを生成する。 パス2はアセンブリ言語コードの実行を行う。 §9: Crayアセンブリ言語命令のトークン化 命令はそれをトークン・リストに変換することによってアセンブルされる。 トークン・リストは6つまでのトークンのレコードからできている。 各レコードはトークン型とトークン番号からできている。 6つのトークンのクラスがある: argument(引数), special(特殊), label(ラベル), floating constant(浮動小数点定数), integer constant(整数定数),other(その他) Argument(引数)トークンはトークン番号を必ず持つ。それは、主にレジスタの ために使われる。 argumentトークンは: A Aレジスタ S Sレジスタ V Vレジスタ B Bレジスタ T Tレジスタ SB 共有アドレス・レジスタ SM セマフォ・レジスタ ST 共有巣から・レジスタ 他の型のトークンは、「special(特殊)トークン」と呼ばれる。それは、次に 与えられる一つの文字列から成り、デリミタ(区切り子)で終わる。 ERR Invalid opcode CA Channel address CL Channel limit address MC Master clear XA XA register SB Sign bit RT Real time clock IP Interprocessor interrupt flag CLN Cluster number PCI Interval interrupt register CCI Clear clock interrupt request ECI Enable clock interrupt request DCI Disable clock interrupt request EFI Enable floating point error interrupt DFI Disable floating point error interrupt ERI Enable operand address range error interrupt DRI Disable operand address range error interrupt DBM Disable bidirectional memory references EBM Enable bidirectional memory references CMR Complete memory references EX Normal exit CE Channel error flag ST Shared scalar register SR Status register SR0 Status register SM Semaphore register TS Test and set 0,A0 Memory address in A0 ,A0 Memory address in A0 START Start directive END End directive ENDP End directive 0.6 Special floating point value .6 0.4 Special floating point value .4 1. Special floating point value 1. 2. Special floating point value 2. 4. Special floating point value 4. DATA Data directive EXEC Execute directive INITA Initialize A register directive INITS Initialize S register directive INITB Initialize B register directive INITT Initialize T register directive INITV Initialize V register directive INITV0 Initialize V0 register directive INITV1 Initialize V1 register directive INITV2 Initialize V2 register directive INITV3 Initialize V3 register directive INITV4 Initialize V4 register directive INITV5 Initialize V5 register directive INITV6 Initialize V6 register directive INITV7 Initialize V7 register directive OPTIONS Specify an options list 第3のトークン型はラベルを表現する。 ラベルは、アセンブリ処理のパス0中で見つかったラベル中の一つと同じ文字 列から成っている。 ラベル・トークンのトークン番号は、LabelList中のラベルの位置で与えられる。 トークンの次の型は、浮動小数点定数を表現する。それは、小数点を一つ含み、 デリミッタで終わる数の桁の列をトークン化するために使用される。トークン 番号は、FloatingConstantList中の定数が置かれた位置を表している。 同様のトークン型は整数定数を表す。整数定数は、デリミッタで終わる数の桁 の列から成る。トークン番号はIntegerConstantList中の定数の位置を表して いる。 最後のトークン型はこれまで以外のすべてに使われる。このトークンのクラス は、コンマ,演算子(+, -, シフトなど)と特殊な記号を含む。 §10: 内部データ構造 アセンブリのセクションで説明された LabelList, BlockNumberList, FloatingConstantList, IntegerConstantList に加えて、 XMPSIMは、他のいくつかのリストを保持している。 InstructionListは、実行された命令の全軌跡、命令のソース上の行番号、発 行時刻、命令の実行開始時刻、完了時刻を保持している。 この情報はGanttチャートを構成するために使用される。 イベントは将来時刻で資源が開放されるために生成される。EventListは、イ ベントの時刻の順に保持される。次に起こるべき16個のイベントが、イベント・ ウインドウで見れる。 ChainingListは、チェインされたオペランドが利用可能になり、現在のクロッ ク・サイクルで操作が実行されるべき機能ユニットから成っている。 チェインされた機能ユニットとポートのシーケンスはいろんな順序で発生し、 そしてそれらの操作は、すべて、現在のサイクルですべて進められなければな らないので、ChainingListは必要なのである。 PortImageListは、ポートCの使用を待つ、発行済みのスカラ・メモリ参照を保 持する。いくつかのスカラ・メモリ参照は、実行中のスカラ参照との競合のた めに、ポートCがビジーであっても、発行することを許される。 §11: データ型と数値 Cray X-MPには4つのデータ型が使われている: reals(実数、浮動小数点数), data integers(データ整数), address integers(アドレス整数), parcels(パーセル) Crayの語長は64bit長であり、データ整数64bit長であるが、アドレス整数は 24bit長である。アドレス整数はアドレスに使用され、データ整数はデータに 使用される。シミュレータは、アドレス整数をMicrosoft PascalのInteger4デー タ型で表現し、内部ではそれらをLongIntegersとして参照している。データ整 数は8Byteの配列として実現し、ルーチン群はこれらの配列へ算術演算を実行 するように書かれた。これらの64bit整数はVeryLongInteger(とても長い整数)型 と言われている。 シミュレータの浮動小数点数は、Cray X-MPが使用している内部表現ではなく、 Microsoft Pascalコンパイラが使用している64bit表現で格納されている。 MS-PascalコンパイラはIEEE標準浮動小数点表現を使用している。しかし、 Cray X-MPは、48bit仮数符号付き形式から成る、正規化された浮動小数点数を 使用している。指数部は14bitの値でexcess-8096記法で表現される。指数の 基数は2である。 浮動小数点表現の違いから、実際に計算した値はCrayでじかに走行させて得ら れた値と少し異なるであろう。 しかし、シミュレータは大きな計算のためではなく、タイミングのために設計 されていることを思えば、最初の版のシミュレータで、それらの値が近似表現 を使用することは十分である。 加えて、Cray X-MPには除算操作がない。代わりに、逆数近似(reciprocal approximation)を使用する。シミュレータは、この近似を、計算された逆数を 15bitへ丸め(rounding)、繰り返しを実行することによって近似する。 整数値や実数値を保持できる資源(Sレジスタ, Tレジスタ, Vレジスタ要素,メ モリ)のために、シミュレータはその資源の値がどのようにセットされたかに 基づき、資源のデータ型を見失わない。 シミュレータは混合モード(mixed mode)の操作を許さない。例えば、浮動小数 点機能ユニットが、整数値に操作を行おうとしたら、シミュレータは結果を 「未定義(undefined)」にセットする。 内部値のデータ型は ValueRecordと呼ばれるデータ構造の中に置いて、ルーチン群に渡される。 ValueRecordは3つの値が続く、一つの型から成っている。 可能な型は: LInteger LongInteger (32 bits) VLInteger VeryLongInteger (64 bits) FLoatingPoint Floating point (64 bits) Undefined 3つの値は、long integer, very long integer, realである。 ほとんどの場合、一時には、型識別子の現在値による、3つの値のうちの一つ が正当である。値のレコード(ValueRecode)の受け渡しは、シミュレータ中で は単一の手法で行われている。 Section 12: シミュレータの制限 シミュレータはCAL命令の全てをアセンブル可能である。 しかし、この版のシミュレータは 実行中に、いくつかの命令をno-ops(NOP)として扱う。 no-op命令は、共有レジスタ、セマフォ、チャンネル・アドレス・レジスタ、 その他I/Oレジスタへのアクセスする命令を含む。 また、割り込みとコンテキスト・スイッチ開始を扱う命令は実装されていない。 シミュレータはバンク競合、ライン競合、命令フェッチ時のout-of-buffer(命 令がバッファに無い)状況、チェインを含む、メモリ・アクセスを正しく取り 扱う。 Cray CALアセンブラによって提供されているいくつかのアセンブラ指令、擬似 命令はシミュレータでは提供されていない。それらの多くはFortran I/Oライ ブラリを呼び出すマクロである。すべてのプログラムは、0起源からの相対で アセンブルされて実行される。 参考文献 1. Cray Research, Cray X-MP Series Models 22 & 24 Mainframe Reference Manual, Publication HR-0032 (1982). 2. The Cray X-Mp/Model 24: A Case Study in Pipelined Architecture and Vector Processing,(1989/09),Kay A. Robbins, Steven Robbins著 ; ISBN-10: 0387970894 ( http://www.amazon.co.jp/exec/obidos/ASIN/0387970894/ ) -- EOF