大分性能を上げてきたが、まだまだ性能向上の余地がある、というか現時点では大鑑巨砲のくせに性能が低すぎる。 どこがボトルネックになるか見てみる。
現状では、パイプライントレースとして、以下のようなログ(コミットログのみ列を抜粋)を出力している。
| | | | |(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サイクル毎に何命令がコミットされているか、グラフにしてみる。
一番高いのは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| | | | | | | |
パイプがスッカスカである。分岐予測がうまくいっていないのと、命令供給が間に合ってないような... これらをどのように対処するかは考える。とりあえずは現状こんな感じでボトルネックになっている部分を解析している。