« アルゴリズムの計算オーダーと並列度の話 | トップページ | バイリニア補間ユニットの並列数について考える »

2016年6月26日 (日)

テクスチャキャッシュについて考えてみる

 続、GPU考察です。テクスチャマッピングはまだ先と思っていましたが、先日射影変換回路を作ったので少し検討して見ます。
 前回は射影変換の座標計算のみ作って、メモリアクセスについては力技前提でXILINXのIPコアのキャッシュを使いました。

 よくよく考えて見ると前回の射影変換はポリゴン1面に対するテクスチャマッピングに他ならないわけです。
 そしてこの手のテクスチャへのメモリアクセスはCPUなどのそれと違ってX-Y平面状に線形的にアクセスするので、例えば座標変換の回転方向の成分によってはY方向に走査することもあるわけです。

 このとき例えばキャッシュ容量がテクスチャサイズ以上にあればよいのかもしれませんが、そうで無い場合悲惨なことになると予想されます。
 例えばポリゴンを90度回転させて貼り付けるケースの場合、1ライン目の走査で、メモリアドレスとしてはY方向に走査していきます。このとき毎回1ピクセルを作るデータ分の為だけにキャッシュライン分のアクセスが行われます。ここで2ライン目の走査までキャッシュの中身が残っていればいいのですが、要領が十分でなかったり、タグの衝突などが起こりキャッシュが残っていなければ極めて悲惨なことになります。Zyboの場合、BRAMは当然少ないし貴重なので、これは重要な問題です。

 またこの際のDDR3-SDRAMのアクセス効率も極めて重要と予想されます。X方向の走査であればアドレスは連続なので、DRAMの同一ページ内で高速なアクセスが起こるはずですが、Y方向の走査であればページをまたぐ為、プリチャージとアクティベートで時間を取られてしまうはずです。さらにバンクだけは同じだったりするとバンクインターリーブすら効かず、悲惨極まりないことになると予想されます。特にZynqのようなメモリをARMプロセッサと共存するようなアーキテクチャの場合、PL側の設計が悪くて知らぬ間にARMの性能が大きく落ちているとか大いにありそうな気がします。

 この回避方法はいろいろ考えられます。

 まず最大の問題はSDRAMのデータ配置がX方向とY方向で非対称になっている点です。
 データ走査の方向に影響を受けにくくするためにはなるべくX-Y方向に非対称にデータを
置けば言い訳です。
 例えば8x8なりのブロックを作って、その単位で書き込み/キャッシュを行えばポリゴンの
走査方向への影響は大幅に緩和されるはずです。

 次にテクスチャキャッシュのTAG-RAMのアサインです。
 簡単のため、例えば16ブロックをキャッシュできるシンプルなダイレクトマップキャッシュを
考える場合、下記のようにアサインすると縦方向走査時のの競合性キャッシュミスは避けられません。


0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 a b c d e f

 ここで、ナンプレ(数独)のように、各縦横や4x4範囲内で同じタグにならないように
配置すれば、競合性キャッシュミスは相当避けられる気がします(wayも作れればさらに良い)。

0 1 2 3 4 5 6 7 8 9 a b c d e f
4 5 6 7 8 9 a b c d e f 0 1 2 3
8 9 a b c d e f 0 1 2 3 4 5 6 7
c d e f 0 1 2 3 4 5 6 7 8 9 a b
1 2 3 4 5 6 7 8 9 a b c d e f 0
5 6 7 8 9 a b c d e f 0 1 2 3 4
9 a b c d e f 0 1 2 3 4 5 6 7 8
d e f 0 1 2 3 4 5 6 7 8 9 a b c
2 3 4 5 6 7 8 9 a b c d e f 0 1
6 7 8 9 a b c d e f 0 1 2 3 4 5
a b c d e f 0 1 2 3 4 5 6 7 8 9
e f 0 1 2 3 4 5 6 7 8 9 a b c d
3 4 5 6 7 8 9 a b c d e f 0 1 2
7 8 9 a b c d e f 0 1 2 3 4 5 6
b c d e f 0 1 2 3 4 5 6 7 8 9 a
f 0 1 2 3 4 5 6 7 8 9 a b c d e

アドレスを逆引きできないのでTAGメモリにフルアドレス保持が必要だが、もともと小さいRAMなので効果の方が大きい気がする。

ということで、Zyboの少ないBRAMを駆使して効率よく映像をぐりぐりまわせるテクスチャキャッシュが作れないか構想(妄想?)中です。

« アルゴリズムの計算オーダーと並列度の話 | トップページ | バイリニア補間ユニットの並列数について考える »

FPGA」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: テクスチャキャッシュについて考えてみる:

« アルゴリズムの計算オーダーと並列度の話 | トップページ | バイリニア補間ユニットの並列数について考える »