OpenGLのImmutable data sotreについて(2)

先日Immutable data sotreへの書き込みは遅いので、スレッドを分けたほうが良いのではないかという記事を書きましたが、誤りでした。

Immutable data sotreに対するアクセス速度

まずはじめに、Immutable data storeで確保した24MByteのメモリ領域に、memcpy()を用いてデータを転送し、ローカルメモリ同士の場合と、転送速度を計測しました。

結果は、
CPU Mem(alloc()) -> Immutable data sotre 8068 MB/sec
CPU Mem(alloc()) -> CPU Mem(alloc()) 7995 MB/sec
計測誤差を鑑みると、ほぼ差がありません。

メモリはDDR3 1.33GHz DualChannelなので、実効帯域としては、この程度なのかも知れません。私のマシンでは、Immutable bufferはメインメモリ上に確保されているようです。
GPUViewのMemoryViewerで該当領域を確認したところ、やはりApertureのセグメントに確保されていました。

imm_write

imm_read_write

確保されるセグメントは、GL_MAP_WRITE_BITのみを設定した場合は、キャッシュされないApertureセグメントに確保されました。
GL_MAP_WRITE_BIT | GL_MAP_READ_BITを設定した場合は、CachedのApertureセグメントに確保されました。
確保時に設定したフラグによって、確保されるセグメントが異なります。
ためしに、GL_MAP_WRITE_BITのみを設定したセグメントを転送元として、memcpy()を実行したところ、約180 MB/secでした。GL_MAP_READ_BITを設定していないので、読み出し自体が許されていない領域ですが、転送速度は著しく遅いです。
GL_MAP_WRITE_BIT | GL_MAP_READ_BITを設定した場合は、約7000 MB/secで読み出すことが出来ました。書き込みに比べると若干遅いですが、問題になるほどではありません。

まとめ

少なくとも、私のマシンでは、Immutable data storeは、GL_CLIENT_STORAGE_BITを設定しなくても、CPU側のメモリに確保されるようです。また、GL_MAP_READ_BITをつけると、CachedのAperture領域を確保して、読み出しを高速に行えるように配慮されます。
DeviceLost(画面解像度の変更などで)を発生させても、バッファの内容は保持されていました。特別何かを意識する必要なく、普通に確保したメモリと同様に扱っても不都合は無いように思えました。
一方で、GPU側からImmutable data storeのバッファにアクセスする際は、PCIeバスを経由したアクセスとなるはずです。帯域や遅延の問題が考えられます。なるべく、GPU側のキャッシュのヒット率が高い状態になるようなアクセスパターンが求められると思われます。(今後機会があれば検証してみたいと思います。)