17.2. 制御プロセッサの変更等
どうする必要があるか?
抜本的対応のためには、
-
ハンドシェイクをする
-
ハンドシェイクはしないが、十分に大きいバッファをとる
のどちらか。現在 DRAM ライトバッファにしているところを回せば後者が可能。
DRAM ライトバッファを小さくできないか?という問題。これは、基本的には
ループの繰り返し回数を十分に小さくできればよい。ループの繰り返し回数は、
原理的には、500 MHz で回ったとしてもデータ回収レートは縮約した後では
500MB/s なので、50マイクロ秒分で 25KB=200kbits であって大した量ではな
い。8ないし 16KB 程度で性能がでるようなチューニングができているべき、
という話。 M4K RAM で16ないしせいぜい32ブロック。
現在の小池/川井回路は、 HIB の制御に hib_mem_writeMC を使っている。
これは uncached への書き込みなので、話にならないほど遅い。
GRAPE-DR での計算起動で何をするべきかをもうちょっとちゃんと考えてみる。
基本的な計算ループ:
-
初めに j 粒子を送る
-
i 粒子を送る
-
計算させる
-
結果を回収する
-
2 に戻る
通信を隠蔽することを考えると
-
初めに j 粒子を送る
-
i 粒子を送る
-
計算させる。次の i 粒子を送る。前の結果を回収する。
-
まだ仕事があれば 3 に戻る
-
最後の結果を回収する
この形のコーディングができるか?
まあ、そこまでする意味があるか?という問題もある。
128 粒子 (512語)回収、 30命令、 1000粒子からの力、とすると、計算に
7500 サイクルかかる。 500MHz なら 25us である。回収はチップからの出力に
は 2us なので、長語としてもあまり問題ではない。 DMA が終わるまではもう
ちょっとかかって、例えば 600MB/s なら 75MW/s なので 7us くらいかかる。
なので、DMA が終わる前に次の計算を始めるのは重要。
i 粒子のほうも同様に 512 語。これも、 7us くらい送るのにかかる。
さらに、ツリーコードの場合には J 粒子転送を隠蔽しないと本当には嬉しくな
い。こっちのほうが i 粒子より多いはずだからである。 30命令ということは
1反復が 120サイクル、J粒子データは 64語なので、半分くらい空きがあり、理
論上は書き込むことが可能である。また、これをしないとしても、 DGEMM で
やっている計算中に FPGA 内部のバッファにいれておいて、計算終わったら
メモリに書く、というのができるだけでも大きく改善する。これと i 粒子の
入れ換え、結果回収を同時にできれば実用上は十分であろう。
オーバーラップされたメモリ書き込みについては、
の両方が満足された時に、勝手に始まる仕掛けが必要。現在どうやってるかを
確認する必要あり。
ハードウェアの改良方法を考えてみないと。
DMA については、現在のハードウェアは PLDA の IP へのレジスタ書き込みを
全てホスト側からの UC write で行っていて、全く話にならない。これを、
DMA の起動、計算起動、その他をキューイングして実行するか、あるいは
一度に実行できるような仕掛けがいる。放送との関係もみる必要がある。
ちょっと、全体を見直すしか方法がないかもしれない、、、
基本的に、キューイングさえできればいいか?というあたりかな。
DGEMM の時。
制御プロセッサの動作
起動前に A 行列をロード (先に DRAM に書いたものを読むのでも本当は良い)
その後は本来ループを繰り返すだけ。
実際には、
・起動する
この時に結果 DMA も始まる
さらに、ホストからデータを送るのも始まる
計算終了とホストからデータ送り終わるのを待って、DRAM にデータ移動
の繰り返しになっている。なので、放送による起動でこれらが
全部同時に動き出してくれれば問題ない。
次の起動との関係は、同期が必要なのをどうするか、という話。放送バスで、
計算が終わったことをつたえればいい。それがくるまで、起動がきても待つ。
この場合、起動自体を隠蔽できる(DMA が完全に終了する前に始められる)ので、
あらゆるものが隠蔽できるはず。
そんなことをしなくても、リダクションが終わったいれば全チップで計算終了
しているので、計算起動は 前の DMAW がおわっていればOK。あるいは、HIB
の前のバッファにデータが全部はいれば計算始められる。但し、
これは処理が追いつかなくなる可能性あり。
273命令とか多いのは、 wdp 命令が必要なこと自体が原因。これはもうちょっ
となんとかしないといけない。それで 10命令程度はすぐに減る。
wdp, rdp ってそもそもなんだっけ?
wdp は転送終了待ち、 rdp はプリフェッチ起動。
こんな感じの命令キュー
計算終了と DMAR 転送待ち
バッファから DRAM への転送
バッファへの DMAR 転送開始
結果 DMAW転送開始
起動