2017-01-09 4 views
-3

매우 이상한 오류가 있습니다. 나는 Conway Game of Life를 에뮬레이션하는 프로그램을 Cuda에 쓴다. 나는 2D 배열을 장치로 전송했고, 상태의 스레드를 검사하는 if-case가있다.NVIDIA Cuda if-statement

if(iam==-1) 
{  //i am on 
    iam=0; 
} 
else if(iam==1) 
{  //i am dying 
    iam=-1; 
} 
else //i am off 
{ 
     if(counter_alive==2)//two neighboors alive 
     { 
      iam=1; //i will be on 
     } 
     // iam = -999; 
} 

마지막 줄이 주석에 있으면 아무 것도 작동하지 않고 var "iam"이 첫 번째 값을 갖습니다. 그러나 만약 내가// 드롭, 작동합니다. 물론, 흐름의 코드가 else를 실행하면 var "iam"은 -999 값을 취합니다. 아이디어가 있으십니까? 내가 놓친 게 있니? 미리 감사드립니다.

+0

@ 탈론 : C 또는 C++과 관련이없는 질문은 어떻게 알 수 있습니까? 그것이 그대로, 나는 그것을 의심하지만, CUDA와 전혀 관련이 없을 수도 있습니다. :) – tera

+1

@tera : 태그 스팸 일 뿐이므로 그 이유가 있습니다. 그리고 평소 C 또는 C++ 화가 트롤 중 하나를 찾아서 제거하고 동시에 불꽃 전쟁을 시작하기보다는 태그를 조용히 제거하는 것이 더 좋을 것입니다. – talonmies

+0

아하. 어쨌든 이것은 통이 뺨이었습니다. @fikos : [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)를 제공해야합니다. – tera

답변

1

변수 iam 또는 counter_alive의 초기 값을 표시하지 않습니다. 컴파일러가 0으로 설정했다고 가정합시다. 물론 컴파일러가 공간을 임의의 값으로 설정하더라도이 분석은 동일합니다.

if(iam==-1) 
{  //i am on 
    iam=0; 
} 

초기 값은 0이기 때문에, 이것은 실패의 초기 값은 0이며, 그때는 실패를 통해 상품 때문에, 다시

else if(iam==1) 
{  //i am dying 
    iam=-1; 
} 

통하여 떨어진다.

else //i am off 
{ 
    if(counter_alive==2)//two neighboors alive 
     { 
      iam=1; //i will be on 
     } 
    // iam = -999; 
} 

이 값은 0으로 입력됩니다. 그러나 counter_alive는 설정되지 않았으므로 0이기도하고 실패합니다.

따라서 iam 변수는 0에서 변경되지 않습니다. 임계 값이 변경되지 않으므로 iam은 0에서 재설정되지 않습니다. 마지막 행의 주석을 제거하면 항상 -999로 명시 적으로 설정됩니다. 어느 쪽도 결코 바뀌지 않을 것이다. 그것은 0이나 999를 테스트하지 않기 때문입니다. -1로 설정하면 counter_alive를 2로 변경하지 않는 한 0으로 변경됩니다.

루프가 처리되는 방법에 대해 설명합니다. 병렬 처리로. 이 경우 배열의 다양한 항목에 대한 반응이 일반 C (단일 스트림) 처리에서 기대하는 것과 다를 수 있습니다.

+0

var iam에는 3 개의 값이 있습니다. 1 -1 또는 0. else 문을 잊어 버릴 수 있습니다. 나는 값 -1로 검사했고 마지막 줄 (iam = -999)은 주석이었다. 첫 번째 if 문에 절대로 입력하지 마십시오. 그러나 iam = -999의 주석을 제거한다면; 첫 번째 if에 들어갑니다. 이상하게 들리 네. 원하는 경우 스크린 샷을 게시 할 수 있습니다. 그것이 cuda thread에 관한 것이면 나는 모른다. – fikos

+0

@fikos 우리는이 코드를보아야 할 것입니다. iam은 무엇으로 정의됩니까? 그것은 int, short, unsigned입니까? iam이 -1로 설정되어 있고 첫 번째 if 문에서 선택되지 않았다는 것을 어떻게 알 수 있습니까? counter_alive는 어떻게 설정합니까? – sabbahillel