自作プロセッサにおいて、性能面でどうしても納得出来ないところがあり、調査していた。
(Cm13,53)[PC=000017a8] R15<=00008184 : LW r15,0x004,r11 (46) 909 (Cm14,--)[PC=000017ac] : SH r13,0x002,r15 910 (Cm18,31)[PC=000017bc] R14<=00000003 : ANDI r14,r16,0x007 (34) 914 (Cm19,42)[PC=000017c0] R17<=000080f0 : LW r17,0x000,r11 (62) 915 (Cm23,37)[PC=000017d0] R15<=00000302 : AND r15,r15,r28 (61) 919 (Cm24,--)[PC=000017d4] : BEQ r17,r 0,0x00 920 (Cm25,--)[PC=000017d8] : BLTU r13,r 6,0x7e 921 (Cm26,49)[PC=000017a8] R15<=00008180 : LW r15,0x004,r11 (37) 922 (Cm27,--)[PC=000017ac] : SH r13,0x002,r15 923 (Cm31,52)[PC=000017bc] R14<=00000004 : ANDI r14,r16,0x007 (35) 927 (Cm32, 3)[PC=000017c0] R17<=000080e8 : LW r17,0x000,r11 (42) 928 (Cm36, 9)[PC=000017d0] R15<=00000403 : AND r15,r15,r28 (13) 932 (Cm37,--)[PC=000017d4] : BEQ r17,r 0,0x00 933 (Cm38,--)[PC=000017d8] : BLTU r13,r 6,0x7e 934 (Cm39,48)[PC=000017a8] R15<=0000817c : LW r15,0x004,r11 ( 9) 935 (Cm40,--)[PC=000017ac] : SH r13,0x002,r15 936 (Cm44,11)[PC=000017bc] R14<=00000005 : ANDI r14,r16,0x007 (60) 940 (Cm45,16)[PC=000017c0] R17<=000080e0 : LW r17,0x000,r11 ( 3) 941 (Cm49,56)[PC=000017d0] R15<=00000504 : AND r15,r15,r28 (45) 945 (Cm50,--)[PC=000017d4] : BEQ r17,r 0,0x00 946 (Cm51,--)[PC=000017d8] : BLTU r13,r 6,0x7e 947 (Cm52,51)[PC=000017a8] R15<=00008178 : LW r15,0x004,r11 (56) 948 (Cm53,--)[PC=000017ac] : SH r13,0x002,r15 949 (Cm57,58)[PC=000017bc] R14<=00000006 : ANDI r14,r16,0x007 ( 8) 953 (Cm58, 7)[PC=000017c0] R17<=000080d8 : LW r17,0x000,r11 (16) 954 (Cm62,31)[PC=000017d0] R15<=00000605 : AND r15,r15,r28 (53) 958 (Cm63,--)[PC=000017d4] : BEQ r17,r 0,0x00 959 (Cm 0,--)[PC=000017d8] : BLTU r13,r 6,0x7e 960 (Cm 1, 6)[PC=000017a8] R15<=00008174 : LW r15,0x004,r11 (31) 961 (Cm 2,--)[PC=000017ac] : SH r13,0x002,r15 962 (Cm 6,44)[PC=000017bc] R14<=00000007 : ANDI r14,r16,0x007 (62) 966 (Cm 7,59)[PC=000017c0] R17<=000080d0 : LW r17,0x000,r11 ( 7) 967 (Cm11,52)[PC=000017d0] R15<=00000706 : AND r15,r15,r28 (49) 971 (Cm12,--)[PC=000017d4] : BEQ r17,r 0,0x00 972 (Cm13,--)[PC=000017d8] : BLTU r13,r 6,0x7e 973
これはある命令シーケンスを一部切り出してきたものだが、LWの前にかなりの空きが出来ている。だが、これらの問題はデータキャッシュの導入によりだいぶ改善されたはずだ。 何が悪いんだろう?
調査してみると、分岐命令のReservationStationの数が足りないため、メモリアクセス命令を十分に発行出来ていないことが分かった。
極端な例だが、たとえば分岐ユニットのReservationStationのエントリ数が少ない状況を考える。
上記の例では、ALUは4エントリx2が2つ分、16命令を保持することが出来るが、LSUは4エントリしか命令を保持できず、また分岐ユニット(BRU)は1命令しか命令を保持できないとする。
すると、例えば数命令内に複数の分岐命令が存在すると、BRUは常に埋まっており、別のエントリに命令が発行出来ない状況が生じる。
たとえば、Inst-03が分岐命令のRSエントリに入ってオペランドを待ち合わせている場合、他のALU命令やLSU命令はそれぞれの命令のエントリに投入されるが、 次のInst-06が分岐命令の場合、その命令は分岐命令用のエントリが空くまで待つことになる。
この場合、同じRNUのスロットに入っているInst-04,Inst-05,Inst-07は無事にRSエントリに投入することは出来るかもしれないが、現在の実装の構造上Inst-06が掃けないと次の命令群、Inst-08,Inst-09,Inst-10,Inst-11を発行することが出来ない。
これを解決するためには、まず単純に数の少ないエントリ数の場所で、エントリ数を増やすということが挙げられる。まずは、この改良を実施しよう。
単純に分岐命令のエントリ数を1から2に挙げた場合、IPCは以下のようになった(デバッグ未なので、いろいろと間違っているかもしれないが...)。
若干改善しているが、そこまで有意ではない。エントリ数が足りていないか、別のところにも問題がありそうだ。調査継続しよう。