2

CUDA_EXCEPTION_5, Warp Out-of-range Address エラーが発生し、その原因となる可能性のあるさまざまなシナリオを把握しようとしています。

私は C プロジェクト (他の誰かによって書かれた) を CUDA に移植することに取り組んでいます。C コードは非常にレジスターが多く、スタック内の多くの配列をインスタンス化します。レジスタのオーバーフローが発生する可能性が非常に高く、それがワープ範囲外エラーを引き起こしている可能性があると想定しています。

最初に実行してから、コードの最適化を開始することに注意してください。

ウィキペディアによると、「スレッドごとのローカルメモリ」が512KBのCompute Capable 3.0ハードウェアを使用しています。SMごとに512KBのレジスタスペースがあることを他の場所で読みました。実行中のスレッドごとに 512KB のレジスタ空間を持つことは可能ですか?

私は現在、次のようにカーネルを実行しています (はい、非常に遅いことはわかっています)。

dim3 grid(28800,1);
cuPlotLRMap<<<grid,1>>>(...)

いくつかの詳細(これがどれほど役立つかわかりません):

私のハードウェアには 7 つの SM があります。実行中のブロックは 112 ありますが、これは各ブロックが 512k 相当のレジスタ空間の 1/16 を取得するということですか?

また、スレッドがレジスタ空間を超えると、グローバル メモリにオーバーフローする可能性があることも理解しています。これが発生した場合、同時スレッドが同じグローバル メモリ空間にオーバーフローする可能性はありますか?

4

1 に答える 1

2

512KB の「スレッドあたりのローカル メモリ」。SMごとに512KBのレジスタスペースがあることを他の場所で読みました。実行中のスレッドごとに 512KB のレジスタ空間を持つことは可能ですか?

CUDA C プログラミング ガイドのコンピューティング機能の表を参照してください。Compute Capability 2.x 以降のデバイスは、スレッドごとに最大 512KB のローカル メモリをサポートします。関数 cudaDeviceSetLimit( cudaLimitStackSize, bytesPerThread ) を使用して値を設定できます。デフォルトはスレッドあたり 2 KB だと思います。

私のハードウェアには 7 つの SM があります。実行中のブロックは 112 ありますが、これは各ブロックが 512k 相当のレジスタ空間の 1/16 を取得するということですか?

Compute Capability 3.x デバイスは、マルチプロセッサごとに最大 16 個の常駐ブロックを持つことができます。これは、レジスタ/スレッド、スレッド/ブロック、または共有メモリ/ブロックがカーネルをデバイスの最大値未満に制限していないことを前提としています。Visual Profiler および Nsight VSE CUDA Profiler は、カーネルによって使用される構成です。

現在、1 つのスレッド/ブロックのみを起動しています。ブロックごとに WARP_SIZE の倍数 (32) を起動する必要があります。

また、スレッドがレジスタ空間を超えると、グローバル メモリにオーバーフローする可能性があることも理解しています。これが発生した場合、同時スレッドが同じグローバル メモリ空間にオーバーフローする可能性はありますか?

コンパイル時または JIT 時に、コンパイラはレジスタ割り当てを実行します。スレッドごとのレジスタが不十分な場合、コンパイラはローカル メモリにスピルします。この操作は決定論的であり、実行時には決定されません。

Compute Capability 3.0 デバイスは、63 レジスタ/スレッドに制限されています。コンピューティング機能 3.5 デバイスは、スレッドあたり 255 レジスターに制限されています。

于 2012-12-03T20:57:48.483 に答える