グローバル メモリを使用する必要がある CUDA (v5.5) アプリケーションがあります。理想的には、定数メモリを使用することを好みますが、定数メモリを使い果たしたため、オーバーフローをグローバル メモリに配置する必要があります。また、(GPU でリダクション操作を行った後) ときどき書き込む必要のある変数がいくつかあり、これをグローバル メモリに配置しています。
読み取りのために、簡単な方法でグローバル メモリにアクセスします。私のカーネルは for ループ内で呼び出され、カーネルの呼び出しごとに、すべてのスレッドがまったく同じグローバル メモリ アドレスにオフセットなしでアクセスします。書き込みについては、各カーネル呼び出しの後、GPU でリダクションが実行され、ループの次の反復の前に結果をグローバル メモリに書き込む必要があります。ただし、私のアプリケーションでは、グローバル メモリへの書き込みよりも読み取りの方がはるかに多くなっています。
私の質問は、動的に割り当てられたグローバル メモリを使用するよりも、グローバル (変数) スコープで宣言されたグローバル メモリを使用する利点があるかどうかです。必要なグローバル メモリの量はアプリケーションによって変わるため、動的割り当てが望ましいでしょう。ただし、グローバル メモリの使用量の上限はわかっており、パフォーマンスに関心があるため、オーバーフローしないことが確実な大きな固定割り当てを使用してメモリを静的に宣言することもできます。パフォーマンスを念頭に置いて、ある形式のグローバル メモリ割り当てを他の形式より優先する理由はありますか? それらは GPU 上の同じ物理的な場所に存在し、同じ方法でキャッシュされますか? それとも、2 つの形式の読み取りコストが異なりますか?