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


以下の各課題プログラムを作成し、レポートせよ。
※質問・疑問は随時受け付ける。

レポート提出期限 2014年8月11日(月)

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

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

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

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

mipsyパイプラインの図

各ステージでの主な処理内容は以下の通りである。

A Simple Implementation of MIPS Pipeline (w/ 6-stage)

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

[IS stage (Instruction fetch Second)]
    IR = reply_read_from_cache(PC);

[RR stage (Register file Read)]
    A = Regs[rs(IR)];
    B = Regs[rt(IR)];
    Imm = imm(IR);        // sign-extended immediate field of IR
    UImm = uimm(IR);      // immediate field of IR

[EX stage (EXecution)]
    Memory references:
    ALUOutput = A + Imm;
    request_read_to_cache(ALUOutput);
        or
    request_write_to_cache(ALUOutput, B);

    Register-Register ALU Instruction:
    ALUOutput = A func B;

    Register-Immediate ALU Instruction:
    ALUOutput = A func Imm;

    Branch:
    ALUOutput = NPC + (Imm << 2);
    Cond = (A == 0);

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

    Branch:
    if (Cond) PC = ALUOutput;

[WB stage (Write Back)]
    Memory references (Load instruction):
    Regs[rt] = LMD;

    Register-Register ALU Instruction:
    Regs[rd] = ALUOutput;

    Register-Immediate ALU Instruction:
    Regs[rt] = ALUOutput;

これをベースとして、データハザードを緩和するためのデータフォーワーディング 機能や、制御ハザードを緩和するための分岐先算出用の加算器・分岐条件判定器などを 追加すること。

紙面にて配布した資料 (Appendix-A Pipelining: Basic and Intermediate Conceptsの一部抜粋)を 参考にするとよい。
(ただし、配布資料では 5段パイプライン構成を前提としているので、当然細部は異なる)

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

課題2. 乗算処理のパイプライン化

乗算処理は通常 1サイクルでは完了せず、複数サイクルで行なわれるが、 これをパイプライン化し、命令間で依存がない場合は、毎サイクル乗算処理を 開始できるようにせよ。

ただし、MIPSの標準的な(整数)乗算命令はこのパイプライン化に向かないため、 以下の 3オペランドの乗算命令を追加し、この命令を実行するときのみパイプライン 処理するものとする。

3オペランド整数乗算命令 MUL (MIPS32命令)
※上段の括弧内はそのフィールドのビット数
opcode (6)rs (5)rt (5)rd (5)shmnt (5)funct (6)
0x1c0〜310〜310〜3100x02

この命令は、rsで指定したレジスタの値と rtで指定したレジスタの値を乗じ、結果の積の 下位32ビットを rdで指定したレジスタに格納する。 (積の上位32ビットは捨てられる)

この命令を使うときは以下のように記述した上で

/* file.S */
	li	$4,2
	li	$5,3
	mul     $2,$4,$5               /* レジスタ4番と5番の値を乗じて2番に格納 */
アセンブルする際に、"-mips32r2"オプションを付ける。 (付け忘れると、 mult命令+mflo命令の2命令に変換されるので注意)
mipsel-elf-gcc -mips32r2 -O file.S -c
mipsel-elf-ld file.o -Tmipsy.ld -o file.bin

課題3. キャッシュメモリの追加

命令パイプラインシミュレータを拡張し、キャッシュメモリを追加せよ。
ただし、n-ウェイのセットアソシアティブ方式とすること。
キャッシュメモリへのアクセス回数やヒット率(あるいはミス率)を表示する 機能を付け、  実際にプログラムを動作させたときの結果を調査せよ。


文責:大津