組み込まれたエンジニア

我輩は石である。名前はまだ無い。

Out of Order実行 SN/X 完成

2010-08-03 17:25:12 | Weblog
一応、自分で用意している4つのテストケースは完動したので、完成としておこう。

最終的に、LD/ST専用にインオーダーのリザベーションステーションを作ったり、各種事象の同時発生対応コードを入れたりと、コード量はずいぶん増えて、現在、794行。

かろうじて800行は切った。まぁ、これでも、Out of Order実行CPUとしては、極小の部類だと思う。

主要諸元は以下の通り


 
CPU アーキテクチャ SN/X
リザベーションステーションALU(2エントリ)
リザベーションステーションBRANCH(2エントリ)
リザベーションステーションLD/ST(2エントリ:インオーダー)
リオーダーバッファ・リネームレジスタ8エントリ
ストアバッファ2エントリ
コード行数794行
開発期間実働4日
使用言語NSL




最後まで悩ませたのが、SORTの例題で、実行結果のメモリがおかしいというもの。これは、メモリまでアウトオブオーダーにしていたので、STの後にLDで同じアドレスを読み出すケースで、LDをSTよりも先に実行してしまい、値を誤っていた。LD/STのリザベーションステーションを1エントリにするという方法もあるけれど、一応、インオーダー2エントリとして対処。メモリをアウトオブオーダーに実行すると、性能上は非常に優れているのだけれど、演算結果がおかしいのでは意味がないね。

インオーダーCPUは、順番に実行するので、リソースの競合はあらかじめ避けるように設計するのだけれど、アウトオブオーダーの場合には各ユニットが勝手に実行するので、同時発生の競合や、読み出し・書き込み同時の場合に、スルーでデータを渡すのか、待たせるのかなど、個別に詳細な検討が必要だ。

それに、何より、結果がおかしい時のデバッグが難しい。
お勧めは、命令リタイヤはインオーダーだし、発行もインオーダーなので、まずは、リタイヤを追いかけて、命令結果を見て、その後、リタイヤアドレスから命令発行場所を探して、解析を行うというもの。

命令発行と命令リタイヤが1命令ずつなので、アウトオブオーダーにしたからといって、大きく性能が向上するわけではないけれど、原理を理解するための教育目的CPUなので、その目的には十分な効果があると思う。


Out of Order実行のSN/X

2010-08-01 07:30:46 | Weblog
500行に収めるのはあきらめ、NSLに非商用ライセンスを設定し、一昨日、3時間、今朝、1時間ほどデバッグ作業の時間が取れたので、少し動きはじめた。でも、メモリへの格納値が微妙(?)に違う。

インオーダーのCPUと違い、デバッグで命令を追いかけるのは、結構大変な作業だ。
デバッグの続きは来週後半かな。。

現状、661行で、(それなりに)動作している。たぶん、アウトオブオーダーCPUとしては、世界最小ではないかな? :-)

/home/SNX> wc snxo.nsl
  661  1647 15510 snxo.nsl


問題のメモリログは、下記。もともと、SN/Xはメモリ待ち時間は0なので、単にアウトオブオーダーにすると、(分岐でリオーダバッファフラッシュが入るし)実行時間は長くなるのだけれど、レジスタリネーミングしているので、レジスタ数の少ないSN/Xには、OOO実行は向いている気がする。

HALTED at      122 clock
00000000: 0001 0002 0004 0000 0000 xxxx xxxx xxxx
00000008: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000010: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000018: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000020: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000028: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000030: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000038: 000b xxxx 000b 0000 000b 0001 0003 0002
00000040: xxxx 0003 xxxx xxxx xxxx xxxx xxxx xxxx
00000048: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000050: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000058: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000060: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000068: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000070: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000078: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

PC:0006 /home/SNX> ^simo^sim
tail -20 sim.log
PC:0003 st  $1,   0($0) -- $0:0010 $1:0006 $2:0003 $3:00
PC:0004
HALTED at      109 clock
00000000: 0006 0002 0004 0000 0000 xxxx xxxx xxxx
00000008: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000010: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000018: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000020: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000028: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000030: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000038: 000b 0000 000b 0001 000b 0002 0003 0003
00000040: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000048: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000050: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000058: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000060: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000068: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000070: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
00000078: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx