我在调试器中单步执行一些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特有的。
由于
答案 0 :(得分: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 */
}
在上面的第一个例子中,sum += k
是for
语句的组成部分;在第二个例子中,它是一个完整的声明。
答案 1 :(得分:4)
“for”之后的单个语句或其中包含一个语句的块之间没有任何执行差异。看看你的代码,你是否意识到我实际上没有增加?也许你的意思是把i + = 256。
就调试器而言,括号构成了“移入”的其他东西,而单行只是一行,就像没有阻塞的if语句一样。