FPGA開発日記

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

アウトオブオーダのCPUを作ろう - 性能向上作戦あれこれ(ボトルネック解析) -

大分性能を上げてきたが、まだまだ性能向上の余地がある、というか現時点では大鑑巨砲のくせに性能が低すぎる。 どこがボトルネックになるか見てみる。

現状では、パイプライントレースとして、以下のようなログ(コミットログのみ列を抜粋)を出力している。

|                                                                         |                                                                         |                                                                         |
|(Cm63,D08)[PC=80000ecc] R03<=ff63b9e6 : lw     r03,0x0000(r07)(05) 250292|(Cm00,D11)[PC=80000ed0] R09<=00000001 : andi   r09,r09,0xffff (41) 250293|(Cm01,D40)[PC=80000ed4] R07<=7f00043c : addiu  r07,r07,0x0004 (38) 250294|
|                                                                         |                                                                         |                                                                         |
|(Cm02,D43)[PC=80000ed8] R12<=0000000b : addiu  r12,r09,0x000a (33) 250295|(Cm03,D45)[PC=80000edc] R08<=00000000 : slt r08,r10,r03       (62) 250296|                                                                         |
|(Cm04,D16)[PC=80000ee0] R04<=fdf7ac96 : addu   r04,r03,r04    (13) 250297|(Cm05,D00)[PC=80000ee4] R10<=ff63b9e6 : addu   r10,r03,r00    (35) 250298|                                                                         |
|(Cm06,D04)[PC=80000ee8] R09<=00000001 : addu   r09,r09,r08    (11) 250299|                                                                         |                                                                         |
|(Cm07,D39)[PC=80000eec] R08<=00000000 : slt r08,r18,r04       (45) 250300|(Cm08,D53)[PC=80000ef0] R12<=000b0000 : sll    r12,r12,r16    (43) 250301|                                                                         |
|(Cm09,D17)[PC=80000ef4] R09<=00010000 : sll    r09,r09,r16    (04) 250302|                                                                         |                                                                         |
|(Cm10,D42)[PC=80000ef8] R12<=0000000b : sra    r12,r12,r16    (53) 250303|                                                                         |                                                                         |
|(Cm11,D57)[PC=80000efc] R09<=00000001 : sra    r09,r09,r16    (17) 250304|(Cm12,D--)[PC=80000f00]               : movn   r09,r12,r08         250305|                                                                         |
|                                                                         |                                                                         |                                                                         |
|(Cm13,D46)[PC=80000f00] R09<=00000001 : movn   r09,r12,r08    (57) 250306|                                                                         |                                                                         |
|                                                                         |                                                                         |                                                                         |
|(Cm14,D52)[PC=80000f04] R09<=00010000 : sll    r09,r09,r16    (46) 250307|                                                                         |                                                                         |
|(Cm15,D--)[PC=80000f08]               : movn   r04,r00,r08         250308|                                                                         |                                                                         |
|(Cm16,D09)[PC=80000f08] R04<=fdf7ac96 : movn   r04,r00,r08    (16) 250309|                                                                         |                                                                         |
|(Cm17,D--)[PC=80000f0c]               : bne    r05,r07,0xffef      250310|(Cm18,D14)[PC=80000f10] R09<=00000001 : sra    r09,r09,r16    (52) 250311|                                                                         |
|                                                                         |                                                                         |                                                                         |
|(Cm19,D44)[PC=80000ecc] R03<=ff561ad2 : lw     r03,0x0000(r07)(08) 250312|(Cm20,D48)[PC=80000ed0] R09<=00000001 : andi   r09,r09,0xffff (14) 250313|(Cm21,D61)[PC=80000ed4] R07<=7f000440 : addiu  r07,r07,0x0004 (40) 250314|
|                                                                         |                                                                         |                                                                         |
|(Cm22,D19)[PC=80000ed8] R12<=0000000b : addiu  r12,r09,0x000a (42) 250315|(Cm23,D23)[PC=80000edc] R08<=00000000 : slt r08,r10,r03       (39) 250316|                                                                         |
|(Cm24,D15)[PC=80000ee0] R04<=fd4dc768 : addu   r04,r03,r04    (09) 250317|(Cm25,D24)[PC=80000ee4] R10<=ff561ad2 : addu   r10,r03,r00    (00) 250318|                                                                         |
|(Cm26,D25)[PC=80000ee8] R09<=00000001 : addu   r09,r09,r08    (48) 250319|                                                                         |                                                                         |
|(Cm27,D55)[PC=80000eec] R08<=00000000 : slt r08,r18,r04       (23) 250320|(Cm28,D30)[PC=80000ef0] R12<=000b0000 : sll    r12,r12,r16    (19) 250321|                                                                         |
|(Cm29,D49)[PC=80000ef4] R09<=00010000 : sll    r09,r09,r16    (25) 250322|                                                                         |                                                                         |
|(Cm30,D34)[PC=80000ef8] R12<=0000000b : sra    r12,r12,r16    (30) 250323|                                                                         |                                                                         |
|(Cm31,D01)[PC=80000efc] R09<=00000001 : sra    r09,r09,r16    (49) 250324|(Cm32,D--)[PC=80000f00]               : movn   r09,r12,r08         250325|                                                                         |
|                                                                         |                                                                         |                                                                         |
|(Cm33,D05)[PC=80000f00] R09<=00000001 : movn   r09,r12,r08    (01) 250326|                                                                         |                                                                         |
|                                                                         |                                                                         |                                                                         |
|(Cm34,D41)[PC=80000f04] R09<=00010000 : sll    r09,r09,r16    (05) 250327|                                                                         |                                                                         |
|(Cm35,D--)[PC=80000f08]               : movn   r04,r00,r08         250328|                                                                         |                                                                         |
|(Cm36,D38)[PC=80000f08] R04<=fd4dc768 : movn   r04,r00,r08    (15) 250329|                                                                         |                                                                         |
|(Cm37,D--)[PC=80000f0c]               : bne    r05,r07,0xffef      250330|(Cm38,D33)[PC=80000f10] R09<=00000001 : sra    r09,r09,r16    (41) 250331|                                                                         |
|                                                                         |                                                                         |                                                                         |
|(Cm39,D62)[PC=80000ecc] R03<=ff487bbe : lw     r03,0x0000(r07)(44) 250332|(Cm40,D13)[PC=80000ed0] R09<=00000001 : andi   r09,r09,0xffff (33) 250333|(Cm41,D35)[PC=80000ed4] R07<=7f000444 : addiu  r07,r07,0x0004 (61) 250334|
|                                                                         |                                                                         |                                                                         |
|(Cm42,D11)[PC=80000ed8] R12<=0000000b : addiu  r12,r09,0x000a (34) 250335|(Cm43,D45)[PC=80000edc] R08<=00000000 : slt r08,r10,r03       (55) 250336|                                                                         |

一行に複数の命令が書いてあれば、1サイクルで複数のコミットを発生させている。これを100サイクル毎に何命令がコミットされているか、グラフにしてみる。

f:id:msyksphinz:20150215103043j:plain

一番高いのは140程度、つまり、1サイクルで1.4命令程度実行できている (4命令同時にコミット可能なのに...)。一方で低いのは40程度、つまり1サイクルで0.4命令程度実行できる。 これは低すぎる。さて、パイプライントレースはどのようになっている?

(Cm15,D--)[PC=80001a2c]               : beq    r03,r15,0x003b      159869|(Cm16,D54)[PC=80001a30] R03<=00000000 : addiu  r03,r03,0xffd0 (46) 159870|                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm17,D41)[PC=80001a34] R03<=00000001 : sltiu  r03,r03,0x000a (54) 159871|                                                                         |                                                                         |
(Cm18,D--)[PC=80001a38]               : bnel   r03,r00,0xffed      159872|(Cm19,D45)[PC=80001a3c] R03<=0000002c : lbu    r03,0x0000(r06)(41) 159873|                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm20,D--)[PC=800019f0]               : bne    r03,r00,0xfff5      159874|(Cm21,D63)[PC=800019f4] R07<=7f0007ee : addu   r07,r06,r00    (36) 159875|                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm22,D--)[PC=800019c8]               : bne    r03,r09,0xffee      159876|(Cm23,D27)[PC=800019cc] R06<=7f0007ef : addiu  r06,r06,0x0001 (34) 159877|                                                                         |
                                                                         |                                                                         |                                                                         |

                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm24,D17)[PC=800019d0] R07<=7f0007ef : addiu  r07,r07,0x0001 (63) 159878|                                                                         |                                                                         |
(Cm25,D--)[PC=800019d4]               : jr     r31                 159879|(Cm26,D--)[PC=800019d8]               : sw     r07,0x0000(r04)     159880|                                                                         |
                                                                         |                                                                         |                                                                         |

                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm27,D28)[PC=80001c28] R04<=7f0007ef : lw     r04,0x0050(r29)(53) 159881|(Cm28,D04)[PC=80001c2c] R02<=00000014 : sll    r02,r02,r02    (19) 159882|                                                                         |
(Cm29,D39)[PC=80001c30] R02<=7f003e2c : addu   r02,r17,r02    (04) 159883|                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm30,D24)[PC=80001c34] R04<=0000002d : lbu    r04,0x0000(r04)(28) 159884|                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm31,D25)[PC=80001c38] R05<=00000014 : lw     r05,0x0020(r02)(14) 159885|                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm32,D50)[PC=80001c3c] R05<=00000015 : addiu  r05,r05,0x0001 (25) 159886|                                                                         |                                                                         |
(Cm33,D--)[PC=80001c40]               : bne    r04,r00,0xfff6      159887|(Cm34,D--)[PC=80001c44]               : sw     r05,0x0020(r02)     159888|                                                                         |
                                                                         |                                                                         |                                                                         |

                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm35,D40)[PC=80001c1c] R04<=7f003e58 : addu   r04,r20,r00    (24) 159889|                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm36,D08)[PC=80001c20] R31<=80001c28 : jalr   r23            (43) 159890|(Cm37,D05)[PC=80001c24] R05<=7f003e18 : addu   r05,r17,r00    (50) 159891|                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm38,D01)[PC=80001940] R07<=7f0007ef : lw     r07,0x0000(r04)(17) 159892|                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm39,D44)[PC=80001944] R03<=0000002d : lbu    r03,0x0000(r07)(45) 159893|                                                                         |                                                                         |
(Cm40,D--)[PC=80001948]               : beq    r03,r00,0x0022      159894|(Cm41,D13)[PC=8000194c] R02<=00000000 : addu   r02,r00,r00    (39) 159895|                                                                         |
(Cm42,D56)[PC=80001950] R02<=0000002c : addiu  r02,r00,0x002c (13) 159896|                                                                         |                                                                         |
(Cm43,D--)[PC=80001954]               : beq    r03,r02,0x0083      159897|(Cm44,D61)[PC=80001958] R10<=bfc00000 : lui    r10,0xbfc0     (47) 159898|                                                                         |
(Cm45,D15)[PC=8000195c] R06<=7f0007f0 : addiu  r06,r07,0x0001 (27) 159899|(Cm46,D16)[PC=80001960] R02<=00000000 : addu   r02,r00,r00    (56) 159900|(Cm47,D49)[PC=80001964] R08<=00000001 : addiu  r08,r00,0x0001 (57) 159901|(Cm48,D02)[PC=80001968] R10<=bfc001b4 : addiu  r1
(Cm49,D37)[PC=8000196c] R12<=0000002b : addiu  r12,r00,0x002b (20) 159903|(Cm50,D48)[PC=80001970] R13<=0000002d : addiu  r13,r00,0x002d (11) 159904|(Cm51,D59)[PC=80001974] R14<=00000045 : addiu  r14,r00,0x0045 (62) 159905|(Cm52,D00)[PC=80001978] R15<=00000065 : addiu  r1
(Cm53,D42)[PC=8000197c] R11<=0000002e : addiu  r11,r00,0x002e (18) 159907|(Cm54,D52)[PC=80001980] R09<=0000002c : addiu  r09,r00,0x002c (58) 159908|(Cm55,D46)[PC=80001984] R07<=00000000 : sll    r07,r02,r02    (01) 159909|(Cm56,D54)[PC=80001988] R07<=bfc001b4 : addu   r0
                                                                         |                                                                         |                                                                         |
                                                                         |                                                                         |                                                                         |
(Cm57,D41)[PC=8000198c] R07<=80001998 : lw     r07,0x0000(r07)(54) 159911|                                                                         |                                                                         |
(Cm58,D--)[PC=80001990]               : jr     r07                 159912|(Cm59,D--)[PC=80001994]               : sll    r00,r00,r00         159913|                                                                         |
                                                                         |                                                                         |                                                                         |

                                                                         |                                                                         |                                                                         |

パイプがスッカスカである。分岐予測がうまくいっていないのと、命令供給が間に合ってないような... これらをどのように対処するかは考える。とりあえずは現状こんな感じでボトルネックになっている部分を解析している。