3

基本的に、ここで何が問題なのかを正確に理解するのに苦労しています。

デバッグ中に共有メモリがブロック排他的に動作しているようには見えません。コードを正常に実行すると、何も出力されません。しかし、デバッグしようとすると、共有メモリがブロック間で共有され、print ステートメントに到達します。

これは一例です。明らかに、これはそれほど有用なコードではありませんが、私のシステムで問題を再現しています。私は何か間違ったことをしていますか?これはバグですか、それともデバッガの予想される動作ですか?

__global__ 
void test()
{
    __shared__ int result[1];
    if (blockIdx.x == 0 && blockIdx.y == 0 && blockIdx.z == 0)
        result[0] = 4444;
    else
    {
        if (result[0] == 4444)
            printf("This should never print if shared memory is unique\n");
    }
}

そしてそれを起動するには:

test<<<dim3(8,8,1), dim3(8,8,1)>>>();

また、共有メモリを完全に誤解している可能性も十分にあります。

助けてくれてありがとう。

その他の情報: GTX 460 を使用しています。プロジェクトには Compute_20 と sm_20 が設定されています。nsight 3.0 プレビューを使用して Visual Studio 2010 でコードを書いています。

4

1 に答える 1

6

の間には微妙だが重要な違いがある

共有メモリがブロック間で共有され、print ステートメントに到達する

共有メモリは連続するブロックで再利用され、print ステートメントに到達します

あなたは前者を想定していますが、実際に起こっているのは後者です。

最初のブロックを除いて、コードは初期化されていないメモリから読み取っています。それ自体が未定義の動作です。C++ (および CUDA) は、静的に宣言されたメモリがスコープに入るとき、またはスコープから出るときに、任意の値に設定されることを保証しません。result値が 4444 に設定されていない可能性がある前のブロックと同じ共有スクラッチ スペースに格納されている可能性がある場合は特に、値が 4444 にならないことは期待できません。

コードの前提全体とこの質問には欠陥があり、未定義の動作が未定義であるという結果から結論を引き出すべきではありません。

于 2013-04-02T20:53:38.020 に答える