FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

自作プロセッサの性能解析とその対策(1.ReservationStationエントリ数と性能の関係)

自作プロセッサにおいて、性能面でどうしても納得出来ないところがあり、調査していた。

(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

上記の例では、ALUは4エントリx2が2つ分、16命令を保持することが出来るが、LSUは4エントリしか命令を保持できず、また分岐ユニット(BRU)は1命令しか命令を保持できないとする。

すると、例えば数命令内に複数の分岐命令が存在すると、BRUは常に埋まっており、別のエントリに命令が発行出来ない状況が生じる。

f:id:msyksphinz:20161121021204p:plain

たとえば、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

若干改善しているが、そこまで有意ではない。エントリ数が足りていないか、別のところにも問題がありそうだ。調査継続しよう。

自作プロセッサの性能解析

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com