3

グローバル メモリを使用する必要がある CUDA (v5.5) アプリケーションがあります。理想的には、定数メモリを使用することを好みますが、定数メモリを使い果たしたため、オーバーフローをグローバル メモリに配置する必要があります。また、(GPU でリダクション操作を行った後) ときどき書き込む必要のある変数がいくつかあり、これをグローバル メモリに配置しています。

読み取りのために、簡単な方法でグローバル メモリにアクセスします。私のカーネルは for ループ内で呼び出され、カーネルの呼び出しごとに、すべてのスレッドがまったく同じグローバル メモリ アドレスにオフセットなしでアクセスします。書き込みについては、各カーネル呼び出しの後、GPU でリダクションが実行され、ループの次の反復の前に結果をグローバル メモリに書き込む必要があります。ただし、私のアプリケーションでは、グローバル メモリへの書き込みよりも読み取りの方がはるかに多くなっています。

私の質問は、動的に割り当てられたグローバル メモリを使用するよりも、グローバル (変数) スコープで宣言されたグローバル メモリを使用する利点があるかどうかです。必要なグローバル メモリの量はアプリケーションによって変わるため、動的割り当てが望ましいでしょう。ただし、グローバル メモリの使用量の上限はわかっており、パフォーマンスに関心があるため、オーバーフローしないことが確実な大きな固定割り当てを使用してメモリを静的に宣言することもできます。パフォーマンスを念頭に置いて、ある形式のグローバル メモリ割り当てを他の形式より優先する理由はありますか? それらは GPU 上の同じ物理的な場所に存在し、同じ方法でキャッシュされますか? それとも、2 つの形式の読み取りコストが異なりますか?

4

2 に答える 2

1

まず第一に、メモリ アクセスを結合することを考える必要があります。使用している GPU については言及していません。最新の GPU では、coallaced メモリの読み取りは、コンスタント メモリと同じパフォーマンスを提供します。そのため、常に可能な限り石炭を混ぜた方法でメモリを読み書きするようにしてください。

もう一つは、テクスチャメモリを使用することができます (データサイズが収まる場合)。このテクスチャ メモリには、いくつかのキャッシュ メカニズムがあります。これは、以前はグローバル メモリの読み取りが結合されていない場合に使用されていました。しかし、最新の GPU は、テクスチャとグローバル メモリに対してほぼ同じパフォーマンスを提供します。

合体の問題がまだ存在するため、グローバルに宣言されたメモリが動的に割り当てられたグローバルメモリよりもパフォーマンスが向上するとは思いません。また、CUDA グローバル メモリの場合、グローバル (変数) スコープで宣言されたグローバル メモリは使用できません。(プログラム内で) グローバルに宣言できる変数は、定数メモリ変数とテクスチャであり、引数としてカーネルに渡す必要はありません。

メモリの最適化については、cuda c ベスト プラクティス ガイドのメモリ最適化セクションを参照してくださいhttp://docs.nvidia.com/cuda/cuda-c-best-practices-guide/#memory-optimizations

于 2013-10-30T01:44:54.507 に答える