CPU実験について考えてみる

3年生は今頃CPU実験を頑張っているのだろう。自分の想像としてはレイトレに特化したハードウェアを作るものだと思っていたけど、普通に四則演算などを用意してやっているところが多いらしい。反射光の方向を求める為の回路とか、レイトレに特化したハードウェアって難しのかな?

ちなみに
ディジタル数値演算回路の実用設計―四則演算、初等超越関数、浮動小数点演算の作りかた (Design Wave Advanceシリーズ)
にはハード的にディジタルエフェクトをかける例が紹介されている。本書では画像をめくるエフェクトをFPGAで実現する方法が乗っていた。
レイトレの場合はさすがにハードウェアオンリーでは無理だと思うけど、ベクトル演算モジュールとか実装できないのかと思ってみた。

と言うことで図書館にたまたまあったC言語による3Dグラフィックス入門を借りてきてレイトレの勉強。

一回の処理単位は

  1. 視線と最初に交差する面を探す
    1. 交差しない場合は何も書かない or 光源
    2. 普通の面の場合はそれを描画する
    3. 反射面の場合は新しい視線を求めて再帰
    4. 屈折面の場合も同じ

という感じ。
そうするとボトルネックになる部分は

  • 交差する面を探す
  • 新しい視線を求める

の2箇所だろう。
新しい視線を求める部分は視線の方向余弦と面の法線の方向余弦から新しい方向余弦を求めるだけだから、ここをどれだけハードで高速化できるかがポイントな気がする。一番面倒なのがたぶん屈折面で、全反射の処理とか入ると面倒。だけど、上の画像を見るかぎり屈折面はなさそうなんだけどな〜邪道な考え方か(笑)

ベクトル演算は絶対値と内積を求める部分以外は基本的にx,y,z成分毎の演算だから並列化できる。つまり浮動小数点数レジスタx3にベクトルの成分を入れ、同じ演算を同時実行できるとめちゃめちゃ早くなるはず。でもそうするとFPUサイズが約3倍になって多分入り切らない。(最近のFPGAだったら入っちゃったりするのかな?)
結局完全な並列化は無理だからパイプラインで頑張るしかない。

んで、レイトレに使うことのみに絞って設計すればハザードがどこで発生するかとかどの程度の確率でどこに分岐するかとかが予測できるわけだから、そこに高速化のポイントがあると思う。


現時点で考えられるのはこれくらい。まだ1年も先だからじっくり勉強を進めていこう。

そういえば

拡張基板でいろいろ遊べるんだった。わくわく.....。


最近SDRAMが使えそうな気がしてきた(自信過剰)やっぱりメモリが自由自在に使えればいろいろ戦略が広がると思う。
例えば、前に先生が話してたんだけど命令長を128ビットにして、その中に複数命令を埋め込むとか。
つまり完全に並列実行できる命令とか、頻繁に連続して行われる命令を一命令でパックして、フェッチ・デコードを一回で済ますことができるようになる。
32bit x 3(x, y, z成分)を一気にメモリから引っ張ってくるなんてことも出来る。夢が広がるなぁ。
現実的には128なんてバスを引けるわけないけど、メモリアクセス回数をいかに減らすかは大事。キャッシュの使い方とか。