FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

リネームIDをISSでモデル化する

レジスタリネーミングでは、アーキテクチャレジスタと物理レジスタを接続するための仕組みだ。 レジスタに書き込みを行う命令が実行されると、アーキテクチャレジスタのIDはリネーミングレジスタレジスタIDに置き換われる。 このレジスタリネーミングの仕組みがうまくいかないと、オペランドを正しく参照することができない。

高性能コンピュータ技術の基礎

高性能コンピュータ技術の基礎

リネームIDはアーキテクチャレジスタの番号に関係なく、シーケンシャルに配置される。 例えば、最初にアーキテクチャレジスタに以下のようにリネームIDが配置されているものとする。

  • R0 : 32
  • R1 : 33
  • ...
  • R31: 63

レジスタリネーミングにより、まずR1に書き込みが行われるとすると、新たにR1にリネームIDが割り当てられ、元々割り当てられている番号33は解放される。

  • R0 : 32
  • R1 : 0 (33は開放)
  • ...
  • R31: 63

これをモデル化するためには、ISSで以下のような変数を用意する。

github.com

  std::unique_ptr<uint32_t []> m_dst_idx;
  std::queue<uint32_t> m_dst_queue;

m_dst_idx はアーキテクチャレジスタの数だけ定義され、どのアーキテクチャにどのリネームIDが保持されているかを記録する。 また、m_dst_queueは使用されていないIDを順番にFIFOで格納される。

これを実装すると、以下のようになる。

      if (GetTraceDstAddr() != static_cast<Addr_t>(-1)) {
        DebugPrint ("(%2d,%2d) ", m_dst_queue.front(), m_dst_idx[GetTraceDstAddr()]);

        m_dst_queue.push(m_dst_idx[GetTraceDstAddr()]);
        m_dst_idx[GetTraceDstAddr()] = m_dst_queue.front();
        m_dst_queue.pop();
      } else {
        DebugPrint ("        ");
      }

レジスタ書き込みのある命令の場合、まずはm_dst_queueの先頭から新しいリネームIDを取得する。 そして、現在のリネームID m_dst_idx[GetTraceDstAddr()] を解放する。解放するということは、FIFOの最後尾に格納することを意味する。

        m_dst_idx[GetTraceDstAddr()] = m_dst_queue.front();
        m_dst_queue.pop();

これにより、Coremarkのテストプログラムを実行すると、以下のようにログが出力されるようになった。(xx,xx)の部分がリネームIDの情報だ。 1つ目が新たに割り当てるIDで、2つ目が解放されるIDだ。

         0:M:MBar:[00000200][P00000200] 7f000197 : auipc      r03,0x7f000          ( 0,34) r03<=7f000200
         1:M:MBar:[00000204][P00000204] e1018193 : addi       r03,r03,0xe10        ( 1, 0) r03=>7f000200 r03<=7f000010
         2:M:MBar:[00000208][P00000208] 7f004117 : auipc      r02,0x7f004          ( 2,33) r02<=7f004208
         3:M:MBar:[0000020c][P0000020c] e0010113 : addi       r02,r02,0xe00        ( 3, 2) r02=>7f004208 r02<=7f004008
         4:M:MBar:[00000210][P00000210] 000000b3 : add        r01,r00,r00          ( 4,32) r00=>00000000 r00=>00000000 r01<=00000000
         5:M:MBar:[00000214][P00000214] 00000233 : add        r04,r00,r00          ( 5,35) r00=>00000000 r00=>00000000 r04<=00000000
         6:M:MBar:[00000218][P00000218] 000002b3 : add        r05,r00,r00          ( 6,36) r00=>00000000 r00=>00000000 r05<=00000000
         7:M:MBar:[0000021c][P0000021c] 00000333 : add        r06,r00,r00          ( 7,37) r00=>00000000 r00=>00000000 r06<=00000000
         8:M:MBar:[00000220][P00000220] 000003b3 : add        r07,r00,r00          ( 8,38) r00=>00000000 r00=>00000000 r07<=00000000
         9:M:MBar:[00000224][P00000224] 00000433 : add        r08,r00,r00          ( 9,39) r00=>00000000 r00=>00000000 r08<=00000000
        10:M:MBar:[00000228][P00000228] 000004b3 : add        r09,r00,r00          (10,40) r00=>00000000 r00=>00000000 r09<=00000000
        11:M:MBar:[0000022c][P0000022c] 00000533 : add        r10,r00,r00          (11,41) r00=>00000000 r00=>00000000 r10<=00000000
        12:M:MBar:[00000230][P00000230] 000005b3 : add        r11,r00,r00          (12,42) r00=>00000000 r00=>00000000 r11<=00000000
        13:M:MBar:[00000234][P00000234] 00000633 : add        r12,r00,r00          (13,43) r00=>00000000 r00=>00000000 r12<=00000000
        14:M:MBar:[00000238][P00000238] 000006b3 : add        r13,r00,r00          (14,44) r00=>00000000 r00=>00000000 r13<=00000000
        15:M:MBar:[0000023c][P0000023c] 00000733 : add        r14,r00,r00          (15,45) r00=>00000000 r00=>00000000 r14<=00000000
        16:M:MBar:[00000240][P00000240] 000007b3 : add        r15,r00,r00          (16,46) r00=>00000000 r00=>00000000 r15<=00000000
        17:M:MBar:[00000244][P00000244] 00000833 : add        r16,r00,r00          (17,47) r00=>00000000 r00=>00000000 r16<=00000000
        18:M:MBar:[00000248][P00000248] 000008b3 : add        r17,r00,r00          (18,48) r00=>00000000 r00=>00000000 r17<=00000000
        19:M:MBar:[0000024c][P0000024c] 00000933 : add        r18,r00,r00          (19,49) r00=>00000000 r00=>00000000 r18<=00000000
        20:M:MBar:[00000250][P00000250] 000009b3 : add        r19,r00,r00          (20,50) r00=>00000000 r00=>00000000 r19<=00000000
        21:M:MBar:[00000254][P00000254] 00000a33 : add        r20,r00,r00          (21,51) r00=>00000000 r00=>00000000 r20<=00000000
        22:M:MBar:[00000258][P00000258] 00000ab3 : add        r21,r00,r00          (22,52) r00=>00000000 r00=>00000000 r21<=00000000
        23:M:MBar:[0000025c][P0000025c] 00000b33 : add        r22,r00,r00          (23,53) r00=>00000000 r00=>00000000 r22<=00000000
        24:M:MBar:[00000260][P00000260] 00000bb3 : add        r23,r00,r00          (24,54) r00=>00000000 r00=>00000000 r23<=00000000
        25:M:MBar:[00000264][P00000264] 00000c33 : add        r24,r00,r00          (25,55) r00=>00000000 r00=>00000000 r24<=00000000
        26:M:MBar:[00000268][P00000268] 00000cb3 : add        r25,r00,r00          (26,56) r00=>00000000 r00=>00000000 r25<=00000000
        27:M:MBar:[0000026c][P0000026c] 00000d33 : add        r26,r00,r00          (27,57) r00=>00000000 r00=>00000000 r26<=00000000
        28:M:MBar:[00000270][P00000270] 00000db3 : add        r27,r00,r00          (28,58) r00=>00000000 r00=>00000000 r27<=00000000
        29:M:MBar:[00000274][P00000274] 00000e33 : add        r28,r00,r00          (29,59) r00=>00000000 r00=>00000000 r28<=00000000
        30:M:MBar:[00000278][P00000278] 00000eb3 : add        r29,r00,r00          (30,60) r00=>00000000 r00=>00000000 r29<=00000000
        31:M:MBar:[0000027c][P0000027c] 00000f33 : add        r30,r00,r00          (31,61) r00=>00000000 r00=>00000000 r30<=00000000
        32:M:MBar:[00000280][P00000280] 00000fb3 : add        r31,r00,r00          (34,62) r00=>00000000 r00=>00000000 r31<=00000000
        33:M:MBar:[00000284][P00000284] 80002417 : auipc      r08,0x80002          ( 0, 9) r08<=80002284
        34:M:MBar:[00000288][P00000288] db040413 : addi       r08,r08,0xdb0        (33, 0) r08=>80002284 r08<=80002034
        35:M:MBar:[0000028c][P0000028c] 000400e7 : jalr       r01,r08,0x0e7        ( 2, 4) r08=>80002034 r01<=00000290 pc<=80002034
        36:M:MBar:[80002034][P80002034] f7010113 : addi       r02,r02,0xf70        (32, 3) r02=>7f004008 r02<=7f003f78
        37:M:MBar:[80002038][P80002038] 00410593 : addi       r11,r02,0x004        (35,12) r02=>7f003f78 r11<=7f003f7c
        38:M:MBar:[8000203c][P8000203c] 00810613 : addi       r12,r02,0x008        (36,13) r02=>7f003f78 r12<=7f003f80
        39:M:MBar:[80002040][P80002040] 04e10513 : addi       r10,r02,0x04e        (37,11) r02=>7f003f78 r10<=7f003fc6
        40:M:MBar:[80002044][P80002044] 08112623 : sw         r01,0x08c(r02)               r02=>7f003f78 r01=>00000290 (7f004004)<=00000290
        41:M:MBar:[80002048][P80002048] 08812423 : sw         r08,0x088(r02)               r02=>7f003f78 r08=>80002034 (7f004000)<=80002034
        42:M:MBar:[8000204c][P8000204c] 08912223 : sw         r09,0x084(r02)               r02=>7f003f78 r09=>00000000 (7f003ffc)<=00000000