3

デバッガーでC/CUDAコードをステップスルーしていました。

for(uint i = threadIdx.x; i < 8379; i+=256) 
    sum += d_PartialHistograms[blockIdx.x + i * HISTOGRAM64_BIN_COUNT];

そして、出力は正しいのに、デバッガーが1つのステップでそれを通過していたので、私は完全に混乱しました。次のスニペットのようにループを中かっこで囲むと、デバッガーで期待どおりに動作することに気付きました。

for(uint i = threadIdx.x; i < 8379; i+=256) {
    sum += d_PartialHistograms[blockIdx.x + i * HISTOGRAM64_BIN_COUNT];
}

したがって、Cまたはデバッガーで異なる方法で処理されるループの括弧はありません。または、おそらくCUDAに固有です。

ありがとう

4

2 に答える 2

10

デバッガーは一度に1つのステートメントを実行します。これをチェックしてください:

int sum = 0;                            /* one assignment statement */
for (int k = 0; k < 10; k++) sum += k;  /* one for statement */

これと比較してください

int sum = 0;                            /* one assignment statement */
for (int k = 0; k < 10; k++)
{                                       /* for statement with the body
                                           in a block of statements */
    sum += k;                           /* assignment statement */
}

上記の最初の例では、はステートメントsum += kの不可欠な部分です。for2番目の例では、それ自体が完全なステートメントです。

于 2009-11-23T10:32:42.987 に答える
4

「for」に続く単一のステートメントと、1つのステートメントを含むブロックとの間に実行上の違いはありません。しかし、あなたのコードを見て、私が実際にインクリメントされていないことに気づいていますか?おそらくあなたはi+=256を置くつもりでした。

デバッガーに関する限り、角かっこは「移動」するための他の何かを構成しますが、単一行はそれだけで、単一行です(ブロックのないifステートメントのように)。

于 2009-11-23T10:34:04.040 に答える