バイリニア補間ユニットの並列数について考える
先日作った射影変換回路では、ニアレストネイバーでの処理でした。
せっかく浮動小数点コアまで作って、座標は小数精度で計算しているのだから、バイリニア補間ぐらいやりたい、と思ってしまいます。
ここで、1画素生成するのにテクスチャは4画素読み込む必要が出てきます。
とはいえテクスチャキャッシュがしっかりしていれば、メモリに対するアクセスは1画素につき一回のはずです。
ではどう組めば綺麗にいくか考えて見ました。
当初考えた案としては大きくは下記の2つ
1) 4ピクセル並列アクセスして 1[pixel/cycle] を処理するSamplerユニットを作る
2) 4回読み込みをする 0.25[pixel/cycle] 処理能力のSamplerユニットを1)の4倍の個数並列動作するように作る
リアルタイムシステム屋の私は普段なら1)のアーキが適するケースが多いのですが、今回のようなグラフィックスのシステムに関しては2)の方がメリットが大きそうです。
こうなってくると、設計指針が見えてきます。
キャッシュミスヒットなども見越して、少しマージンを取った上で
- 出力帯域に必要なだけのSamplerユニットの並列数を決める
- 想定テクスチャサイズに対して十分なヒット率が出る前提でL2キャッシュの容量と見合ったメモリ帯域を決める
- Samplerの並列実行を前提に、1つのSamplerが分担するであろう想定テクスチャサイズでL1キャッシュのサイズを決める
- 各Samplerの重複部分のマージンを賄えた上でL1<=>L2の帯域を決める
バイリニアの場合、書くピクセルは都合4回程度再利用されるはずなのでL1キャッシュは効果的に効くはずで。
一方で、L2キャッシュは
- Sampler同士で重複利用する部分のヒット率向上
- SDRAMアクセスを大きな単位とすることでメモリアクセス効率向上
の2点に大きく寄与するはずです。
サイズも L1 < L2 と なるはずで、アーキテクチャとしては綺麗に嵌りそうな感じです。
ついでに間のバスもここはシンプルにリングバス使えないかなと、構想(妄想?)中だったりします。
<余談>
リアルタイムシステムを考える場合、4並列コアより、4倍早いコア1つの方が価値があります。4並列の場合、4つのタスクが同時に終わりますが、1コアですめばタスクは順番に完了していきますので、デッドラインの厳しいものから順にスケジューリングすることでシステムの応答性を高めることが出来ます。
一方で、ポラックの法則しかり、4倍早いコアを作るのには4倍以上のリソースがかかります。GPUなどの場合、各ピクセルのリアルタイム要件は等しいですので、並列化がメリットが大きいわけです。
さらに余談を進めると、TSS(タイムシェアリングシステム)というのは、リソースが希少な時代のCPUの利便性を高めるための産物でして、パフォーマンスのあるCPUをわざわざパフォーマンスの低いCPUが複数あるように見せかけて使う方式には、リアルタイムシステムという観点ではデメリットしかなかったりします。
一方で近年のOSはRTOS的な要素を取り込みつつはあるものの現代に至ってもベースがTSSなので、そのへんはなんだかもったいない気がする今日この頃です。
« テクスチャキャッシュについて考えてみる | トップページ | Xilinxの分散メモリを見直してみた »
「FPGA」カテゴリの記事
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
- MNIST認識のリアルタイム動作環境更新(2019.09.02)
この記事へのコメントは終了しました。
コメント