2.5.04以上で搭載されたAutomatic memory managementに関してはこちらの記事をご参照ください。
GPUプログラムの課題の1つは、メモリ管理です。Redshiftは、各フレームの始めに定義されている既知の制限内(GPUメモリ制限、動的メモリ割り当てが難しい)で動作するように、異なるモジュール間で空きGPUメモリを分割する必要があります。
多くのCPUレンダラも同様の種類のメモリ分割を行います。 他のレンダラが「ダイナミックジオメトリメモリ」や「テクスチャキャッシュ」などを参照しているのを見たことがあります。 ダイナミックジオメトリメモリ」はシーンのポリゴンを保持し、「テクスチャキャッシュ」はテクスチャを保持します。 Redshiftもまた、ポリゴンとテクスチャに「ジオメトリメモリ」と「テクスチャキャッシュ」を使用します。
さらに、Redshiftはレイ用メモリを割り当てる必要があります。GPUは大規模並列プロセッサーなので、Redshiftは常にレイのリスト(「workload」)を作成し、GPUにおくります。 GPUに送るレイが多くなればなるほど、パフォーマンスは向上します。 例えば、1920x1080シーンでは、1ピクセルあたり1024レイのbrute-force GIを使用すると、最低21億のレイを計算する必要があります。また、この中にはアンチエイリアシング、シャドウ、被写界深度などに必要なレイが含まれていません。これらのレイをすべてメモリに保存することは、あまりにも多くのメモリを必要とするため不可能です。したがって、Redshiftは、 これらのパーツを個別に提出することができます。これにより、単一のパーツでGPUに十分なメモリを確保するだけで済みます。Redshiftは作業を「パーツ」に分割し、これらのパーツを個別に送ります。この方法であれば、単一のパーツに対して十分なGPUメモリのみがあれば大丈夫ということになります。
IrradianceキャッシュやIrradiance Pointクラウドなどの特定の手法では、中間点を格納するための計算段階で余分なメモリが必要となります。この計算段階で生成されるポイント数は事前に不明なので、メモリを確保しておく必要があります。
Redshiftのメモリ割り当て方法
レンダラがメモリを割り当てる順序は以下のとおりです。
- 利用可能な空きGPUメモリを取得します。
- Irradiance cacheの計算またはIrradiance point cloudの計算を行う場合、適切に確保されたメモリ(デフォルトで128MB)を引き算します。
- Irradiance cache、フォトンマップ、 irradiance point cloudまたはSSSを使用している場合は、そのメモリスペースを割り当てます。
- 単一パーツにレイメモリを割り当てます
- 残メモリから、ジオメトリ(ポリゴン)とテクスチャに使用します。
メモリオプション
Percentage of GPU Memory to use
空きメモリのうち、Redshiftが実際に使用する割合を決定します。
Irradiance Point Cloud Working Tree Reserved Memory
Irradiance point cloud計算中に使用される「作業」メモリです。
Irradiance Cache Working Tree Reserved Memory
Irradiance Cache計算中に使用される「作業」メモリです。
Percentage Of Free Memory Used For Texture Cache / Maximum Texture Cache Size
空きメモリから予約メモリとレイを引き算すると、残りはジオメトリ(ポリゴン)とテクスチャキャッシュ(テクスチャ)に分割されます。「パーセンテージ」パラメーターはテクスチャに対して使用できる空きメモリのパーセンテージをレンダラに伝えます。
参考例:
2GBのビデオカードを使用していて、予約バッファとレイを引き算した残りが1.7GBとします。テクスチャキャッシュのデフォルト15%が意味するのは、1.7GBの15%、すわなち約255MBが使用できるということです。一方、1GBのビデオカードを使用していて、予約済みのバッファとレイを引いて、700MB残っている場合、テクスチャキャッシュは最大105MB(700MBの15%)になります。
テクスチャキャッシュに使用できる最大MBがわかったら、「Maximum Texture Cache Size」オプションを使用してさらに制限することができます。これは空きメモリが多いビデオカードに便利です。 たとえば、6GBのQuadroを使用していて、予約済みのバッファとレイを引いた後に5.7GBの空き容量があるとします。その15%は855MBです。 このような大きなテクスチャキャッシュが必要となるシーンはあまりありません。「Maximum Texture Cache Size」オプションがない場合は、使用しているビデオカードに応じて「パーセンテージ」オプションを変更する必要があります。
2つのオプション( "Percentage"と "Maximum")を使うと、多くの空きメモリを持つビデオカードでメモリを無駄にせず、意味のあるパーセンテージを指定することができます。
Ray Reserved Memory
この設定をゼロのままにしておくと、Redshiftはシェーダーの設定に応じて一般的なメガバイトを使用します。しかし、ポリゴンが非常に軽いシーンの場合、または空きメモリが多いビデオカードを使用している場合は、レイのバジェットを指定してレンダリングのパフォーマンスを向上させることができます。
Irradiance Point CloudまたはIrradiance Cacheの予約メモリの調整
唯一この数字を変更する必要があるケースは、次のようなメッセージが表示された場合です。
"Irradiance cache points don't fit in VRAM. Frame aborted. Please either reduce Irradiance Cache quality settings or increase the irradiance cache memory budget in the memory options"(「Irradiance CacheポイントがVRAMに収まりません。フレームが中止されましたIrradiance Cacheの品質設定を減らすか、メモリオプションのirradiance cacheメモリのバジェットを増やしてください」)
"Irradiance point cloud doesn't fit in VRAM. Frame aborted. Please either increase the 'Screen Radius' parameter or the irradiance point cloud memory budget in the memory options"(「Irradiance point cloud はVRAMに収まりません。フレームが中止されました。「Screen Radius」パラメーターか、メモリオプションのIrradiance point cloud バジェットを増やしてください」)
Irradiance point cloud またはIirradiance cacheの品質パラメータを変更することができない(または望ましくない)場合は、メモリを増やすことができます。 すでに多くのメモリを使用していて、まだこのメッセージが表示されている場合、シーンに非常に細かい詳細を多く含んでいる可能性があるため、Brute-Force GIを使用することをお勧めします。
テクスチャキャッシュメモリの調整
Redshiftがレンダリングすると、「Feedback Display」ウィンドウがポップアップするはずです。(「Feedback Display」がないアプリケーションもあります) このウィンドウには、個々のモジュールに割り当てられるメモリの量に関する有用な情報が含まれています。 これらのエントリの1つが「テクスチャ」です。
その数字は、テクスチャに対してCPUがPCIeバス経由でGPUにアップロードしなければならなかった大きさ(MB)をレポートしています。はじめは、「0 KB [128 MB]」のような感じで表示されています。 これは、「あなたのテクスチャキャッシュは128MBで、まだデータをアップロードしていません」ということです。
Redshiftは、ギガバイトのテクスチャデータを含むシーンを正常にレンダリングできます。 これは、テクスチャキャッシュを再利用することで可能です(この場合128MB)。テクスチャ全体をアップロードする代わりにテクスチャの必要な部分だけをアップロードします。したがって、テクスチャが遠く離れている場合は、より低い解像度のテクスチャ(これらは「MIPマップ」と呼ばれます)とそのMIPマップの特定のタイルのみが使用されます。
このようなメモリを再利用する方法により、PCIeで転送された数値がテクスチャキャッシュサイズよりも大きくなることを見かけることがあります(角カッコで示されています)。多くの場合は問題ありません。数メガを再アップロードするパフォーマンスペナルティは通常は問題にはなりません。
ただし、「Uploaded」値があっというまに数百メガ、最悪ギガバイトになる場合、テクスチャキャッシュサイズが小さすぎるため、追加する必要があります。
このような場合は、行うべきことがあります:
- 最初に「Max Texture Cache Size」を増やしてみてください。 デフォルトは128MBです。 テストで256MBを試してみてください。
- 上記を実行して、Feedbackウィンドウに表示された数値が256MBにならない場合は、「Percentage Of Free Memory Used For Texture Cache」を増やす必要があります。
レイ予約メモリの増加
平均して、Redshiftは、60MBのメモリにつき約百万の三角形に適合することができます(一般的に単一のUVチャネルと頂点あたりのタンジェント空間を含むメッシュの場合)。数百万の三角形を持つシーンにおいても、いくらかメモリの空きを残すことができることを意味します。(ジオメトリには使用されません)
既に説明致したとおり、メモリをレイに再割り当てすることができます。これにより、RedshiftはGPUにより少ない数で、より大きなパケットを送ることができ、場合によってはパフォーマンスが向上します。
シーンのジオメトリがGPUメモリを十分に活用できていないか判断するのは簡単です。Feedback displayの "Geometry”"の項目を見るだけです。テクスチャキャッシュと同様に、ジオメトリメモリは再利用されます。シーンがシンプルであれば(フレームをレンダリングした後で)、PCIe転送されたメモリがジオメトリキャッシュサイズ(角カッコで示されている)を大幅に下回ることがわかります。 たとえば、「Geometry:100MB [400MB]」のように表示されます。 この例では、300MBを使用してレイに再割り当てできることを示しています。
現在使用されているレイメモリも Feedback display の "Rays"に表示されます。 それは "Rays:300MB"といったように表示されます。 したがって、メモリオプションでは、約600MBの「Ray Resevered Memory」を作ることができます。つまり、レイが使用している300MBに対して、ジオメトリが使用していない300MBを追加します。
※最初にご紹介いたしました通り、2.5.04以上ではAutomatic memory management(自動メモリ管理)が搭載されています。こちらの記事をご参照ください。