自作プロセッサにおいて、性能面でどうしても納得出来ないところがあり、調査していた。
(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のエントリ数が少ない状況を考える。
![f:id:msyksphinz:20161121020831p:plain f:id:msyksphinz:20161121020831p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20161121/20161121020831.png)
上記の例では、ALUは4エントリx2が2つ分、16命令を保持することが出来るが、LSUは4エントリしか命令を保持できず、また分岐ユニット(BRU)は1命令しか命令を保持できないとする。
すると、例えば数命令内に複数の分岐命令が存在すると、BRUは常に埋まっており、別のエントリに命令が発行出来ない状況が生じる。
![f:id:msyksphinz:20161121021204p:plain f:id:msyksphinz:20161121021204p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20161121/20161121021204.png)
たとえば、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は以下のようになった(デバッグ未なので、いろいろと間違っているかもしれないが...)。
![f:id:msyksphinz:20161121021602p:plain:w1200 f:id:msyksphinz:20161121021602p:plain:w1200](https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20161121/20161121021602.png)
若干改善しているが、そこまで有意ではない。エントリ数が足りていないか、別のところにも問題がありそうだ。調査継続しよう。
自作プロセッサの性能解析
msyksphinz.hatenablog.com
msyksphinz.hatenablog.com
msyksphinz.hatenablog.com