2009-11-23 3 views
3

내가 좋아하는 몇 가지 C/CUDA의 디버거 코드, 뭔가를 단계별로 하였다C에서 괄호가 있거나없는 괄호는 다르게 처리됩니까?

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 += kfor는 문장의 일부이고; 두 번째 예에서는 자체적으로 완전한 진술입니다.

4

"for"다음에 나오는 단일 명령문이나 하나의 명령문이있는 블록간에 실행 차이가 없습니다. 그래도 코드를 보면 내가 실제로 증가하지 않는다는 것을 알 수 있습니까? 아마도 당신은 i + = 256을 넣으려고했다.

디버거가 염려하는 한 대괄호는 "움직이기"위한 다른 것을 구성합니다. 단 한 줄은 그냥 한 줄 (블록이없는 if 문처럼)입니다.

+0

죄송합니다. i + = 256이었습니다. 코드를 여기에 복사하는 실수를 저질렀습니다. – zenna

관련 문제