0

機能 3.5 (GTX Titan)、CUDA 5、VS 2010、および Nsignt。非グラフィカル アプリケーション。

特定のブロックサイズに達するOutOfRangeStoreと、説明付きの例外が発生しますMemory Space=Global Size=4

これは機能します: ブロックサイズ 4 (およびそれ以下) の 10,000 スレッドまたはブロックサイズ 32 の 898 スレッド

これは機能しません: ブロックサイズ 5 (およびそれ以上) の 10,000 スレッドまたはブロックサイズ 32 の 899 スレッド。

Nsight を使用してデバッグすると、float 配列を割り当てている場所でコードが壊れています。たとえば、float* x = new float[someSmallValue]上記の行と以下の行は他の配列を割り当てているため、範囲外の変数への割り当てはありません。実際には、関数全体が新しい配列です。

関数内で配列の割り当てをシャッフルしても、同じ場所、関数の最後の行でエラーが発生します。

私の予感は、SM レベルで最大の「何か」に達しているということです。

以前に同様の問題が発生したことがあり、どこを調べればよいか教えていただけますか?

私は次のことを試しました:

  • グローバルメモリを消費しているかどうかを確認するためのプロファイリングですが、トランザクションやその他のものをプロファイリングできましたが、プログラム実行の最大使用グローバルメモリをプロファイリングできませんでした.96個のレジスタを使用しています.0共有メモリ。「CUDA Launching」セクションに焦点を当てています

プロファイラーで別の場所を探すことをお勧めしますか?

  • 私のプログラムが何をしているかを分析しようとしてコンパイルするときに、NVCCコンパイラの出力を見ています。これは引用です:
ptxas : info : _Z14DeletePointersP10DevSimTemp の関数プロパティ
    8 バイトのスタック フレーム、8 バイトのスピル ストア、8 バイトのスピル ロード ptxas : info : fabsf の関数プロパティ
    0 バイトのスタック フレーム、0 バイトのスピル ストア、0 バイトのスピル ロード ptxas : info : _Z28UpdateTimeStep の関数プロパティ
    24 バイトのスタック フレーム、20 バイトのスピル ストア、20 バイトのスピル ロード ptxas : info : 関数のプロパティ
_Z21CopyNextStepToRunningP10DevSimTempii
    0 バイトのスタック フレーム、0 バイトのスピル ストア、0 バイトのスピル ロード ptxas : info : 関数のプロパティ
_Z21SendTimeStepToResultsPK19DevSimulationResultP10DevSimTempii
    0 バイトのスタック フレーム、0 バイトのスピル ストア、0 バイトのスピル ロード ptxas : info : 関数のプロパティ
_Z26UpdateCalcsResultsPK19DevSimulationResultP10DevSimTempiiPfPifiiS4_
    64 バイトのスタック フレーム、60 バイトのスピル ストア、60 バイトのスピル ロード

こぼれはバグを引き起こす可能性がありますか?バグハンティングの観点から(パフォーマンスの観点からではなく)有用ですか?

4

1 に答える 1

2

ヒープ領域が不足している可能性があります。デフォルトでは、ごくわずかなヒープ領域しか利用できません。所持金は次の方法で確認できます。

size_t heap_size;
cudaDeviceGetLimit(&heap_size, cudaLimitMallocHeapSize);

そして、対応するcudaDeviceSetLimit()呼び出しで値を調整します。

于 2013-05-31T22:47:01.820 に答える