計算機アーキテクチャ特論 レポート課題


以下の各課題プログラムを作成し、レポートせよ。(ただし、課題3はオプション課題)
※質問・疑問は随時受け付ける。

レポート提出期限 2013年8月12日(月)

レポートは 学科授業支援システム CoursePowerで提出すること。

課題1. 命令パイプラインシミュレータの作成

ARM命令セットを持つパイプラインプロセッサのシミュレータを作成せよ。
ただし、非パイプラインシミュレータarmyをベースとして、 5段パイプライン構成とすること。

基本的なパイプライン構成図は以下の図に示す。
(非パイプラインシミュレータでは、このパイプラインの各ステージを 命令サイクルの1サイクルごとに逐次的に処理している)

armyパイプラインの図

各ステージでの主な処理内容は以下の通りである。
(概要を示すための擬似コードであるため、必ずしも厳密なものではないことに注意)

A Simple Implementation of ARM Pipeline (w/ 5-stage)

[IF stage (Instruction fetch)]
    request_read_to_cache(PC);
    PC = PC + 4;

[ID stage (Instruction decode)]
    IR = reply_read_from_cache(PC);

    decode(IR);

    A = read_source_operand_1();
    B = read_source_operand_2();
    C = read_source_operand_3();

[EX stage (EXecution)]

    /* Memory references: */
    if (U-bit is on)
        ALUOutput = A + B;
    else
        ALUOutput = A - B;

    if (IR is load-op)
        request_read_to_cache(ALUOutput);
    else
        request_write_to_cache(ALUOutput, B);


    /* Register-Register ALU Instruction: */
    opr2 = calc_operand2_val(IR, B, C);
    ALUOutput = A func opr2;
    if (S-bit is on)
        update_flags();

    /* Register-Immediate ALU Instruction: */
    opr2 = calc_operand2_val(IR, B, C);
    ALUOutput = A func opr2;
    if (S-bit is on)
        update_flags();

    /* Branch: */
    ALUOutput = A + (B << 2);
    if (L-bit is on)            /* BL */
        ALUOutput2 = C;

    /* Branch (BX only): */
    ALUOutput = A;

[MA stage (Memroy Access)]
    /* Memory references (Load instruction): */
    LMD = reply_read_from_cache(ALUOutput);

    /* Branch: */
    if (CondOK)
        PC = ALUOutput;

[WB stage (Write Back)]
    if (CondOK) {

        /* Memory references (Load instruction): */
        Regs[Rd] = LMD;
        if (W-bit is on)
            Regs[Rn] = ALUOutput;

        /* Memory references (Store instruction): */
        if (W-bit is on)
            Regs[Rn] = ALUOutput;

        /* Register-Register ALU Instruction: */
        Regs[Rd] = ALUOutput;

        /* Register-Immediate ALU Instruction: */
        Regs[Rd] = ALUOutput;

        /* Branch (BL only): */
        Regs[14] = ALUOutput2;
    }

これをベースとして、データハザードを緩和するためのデータフォーワーディング 機能や、制御ハザードを緩和するためのパイプライン制御機能を追加すること。

命令パイプラインの動作を表示する機能を付け、 実際にプログラムを動作させたときの様子を表示させよ。
(いろいろ表示を工夫してパイプラインの動作が見やすくするとよい)

課題2. キャッシュメモリ機能の追加

パイプライン版シミュレータを拡張し、キャッシュメモリを追加せよ。 コピーバック(ライトバック)方式のキャッシュとして実現すること。 また、n-ウェイセットアソシアティブ方式とし、nを自由に変更できるように 作成すること。

キャッシュの制御を実現するために必要なデータ構造を定義し、 以下のメンバ関数を作成することで実現すればよい。
※実現の簡単化のため、 キャッシュのアドレスタグや validビット/dirtyビットなど制御部分のみを 考慮し、データ自体はメモリに対して直接読み書きするようにしているので注意。

また、以下のプログラムを使って、 ダイレクトマップ(n=1)、セットアソシアティブ(n=2または4)のときのシミュ レーションを行い、 キャッシュメモリへのアクセス回数やヒット率(あるいはミス率)を計測せよ。

行列の乗算プログラム
Cソースファイル/ 逆アセンブルリスト/ ダンプテキストファイル

課題3. 分岐予測機構の追加

パイプライン版シミュレータを拡張し、分岐予測機構を追加せよ。
予測方式は何を使ってもよい。 (ただし、not-taken予測以外にする)

分岐予測の回数や成功率(あるいは失敗率)を表示する機能を付け、 実際にプログラムを動作させたときの分岐予測の性能について調査せよ。


文責:大津