以前から作成中のテクスチャキャッシュの改善に取り組んでいます。
以前との大きな修正点として、L1とL2の間のリングバスの数をL2のユニット1つにつき、リング1つとして多重化しています。
L1の帯域に見合った幅を確保するのに、単純にバス幅を広げるだけでは追いつけないと気が付いたためです。
また、現在、キャッシュの先読み機構を検討中です。
以前分散メモリを考察しましたが、現在、L1キャッシュ1個の構成が 24bit色 4×4 を64エントリ保持できるユニットで、
register : 277
LUT’s : 160
BRAM : 2
で、 503.711MHz という、思ったよりコンパクトで高速です。
特にTAGRAM部分が
register : 107
LUT’s : 70
と、分散RAMの効果にあやかっています。
そこで、「TAGRAMだけもう一個クローンを作れば先行して次のアクセス先のメモリアクセス発行できるのではないか?」との思いつきで、次の実験を準備中です。
L1, L2 どちらにも言えることですが、キャッシュのユニットの状態は大きく、
- アイドル(リクエストがなく遊んでいる)
- メモリアクセス待ち(キャッシュミス)
- データを返す(キャッシュヒット)
の3状態あります。
アクセスする側としては、常にデータを返して欲しいのですが、ミスヒット時のアクセス待ち時間が長いと、稼働率が下がってしまいます。
また、L2キャッシュに関しては、L1キャッシュが次のリクエストをしてくれないと、アイドルが続くという、これまたメモリ側のバスを遊ばせてしまい、メモリ帯域が遊んでしまうというもったいないことが起こってしまいます。
では、メモリ帯域を有効に使いつつ、キャッシュヒットしている時間を増やすにはどうすればよいかというと、「キャッシュヒットしてデータを返している間に、次にミスヒットする箇所を先にメモリアクセスしておけばよい」ということになります。
今のところバイリニア変換などのコアは次々とアクセス要求を出してきてくれますので、これを先行して、実際のメモリを管理するTAGRAMとは別に、クローンのTAG-RAMを作ってそこに入れていけば、将来のTAGRAMの状態が先読みでき、アドレッシング部分だけ先行して動かすことが可能になるはずです。
ということで、試作中です。
ただ、その過程で、小さなFIFOがたくさん必要なことに気が付きました。
今はBRAM用に作ったFIFOを分散RAMにして適用していますが、XILINXのLUTにはシフトレジスタの機能もあるので、こちらを使ったFIFOを作るべきかもしれません。
普通のFIFOではwrite/readの双方にポインタが必要ですが、シフトレジスタをうまく使えば片側で済みそうな気がします。
ちなみに、なぜXILINXのIPコアを使わないかというと、趣味の世界だからです(笑)。
(GUIでの生成が面倒ってのもありますが、多分ちゃんと調べれば parameter でも作れるんだとは思います。)
コメント