3

我正在调试器中单步执行一些 C/CUDA 代码,例如:

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

我完全糊涂了,因为调试器一步步通过了它,尽管输出是正确的。我意识到,当我像下面的代码片段那样在循环周围放置大括号时,它在调试器中的行为与预期的一样。

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

在 C 或调试器中以不同方式处理的循环也是无括号的,或者它可能是 CUDA 特有的。

谢谢

4

2 回答 2

10

调试器一次执行一条语句。看一下这个:

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 */
}

在上面的第一个示例中, thesum += kfor语句的组成部分;在第二个示例中,它本身就是一个完整的语句。

于 2009-11-23T10:32:42.987 回答
4

在“for”之后的单个语句或其中包含一个语句的块之间没有任何执行差异。不过,看看您的代码,您是否意识到 i 实际上并没有增加?也许你的意思是把 i+=256。

就调试器而言,括号构成要“移入”的其他内容,而单行就是这样,单行(就像没有块的 if 语句一样)。

于 2009-11-23T10:34:04.040 回答