2017-01-09 3 views
-3

У меня очень странная ошибка. Я пишу программу в Cuda, которая эмулирует Game of Conway. Я передал 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; 
} 

Когда последняя строка находится в комментарии, ничего не работает, и переменная «iam» имеет первое значение. Но если я опустил //, это сработает. Конечно, если код потока выполняет else, var «iam» примет значение -999. Любые идеи? Я что-то пропустил? Спасибо заранее!

+0

@talonmies: Как вы знаете, вопрос не имеет ничего общего с C или C++? Как бы то ни было, я бы предпочел предположить, что это так, но может и не иметь никакой связи с CUDA. :) – tera

+1

@tera: Потому что это просто спам для тегов, вот почему. И я бы предпочел просто удалить теги тихо, вместо того, чтобы принести один из обычных C или C++ сердитых троллей, удалить их и начать пламенную войну в то же время. – talonmies

+0

А, ок. В любом случае, это было вмятина. @fikos: вам действительно нужно предоставить [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). – tera

ответ

1

Вы не видите начальное значение переменной iam или counter_alive. Предположим, что компилятор установил значение 0. Конечно, даже если компилятор просто задает пространство случайному значению, этот анализ будет таким же.

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

Поскольку начальное значение равно 0, то это терпит неудачу и падает через

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

Опять же, поскольку начальное значение равно 0, то он терпит неудачу и падает до конца.

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, оно изменилось бы на 0, а затем никогда не изменилось бы, если вы не измените counter_alive где-то еще на 2.

Обратите внимание, что Explanation of CUDA C and C++ объясняет, как обрабатывается цикл как параллельная обработка. В этом случае реакция различных элементов в массиве может быть не такой, какой вы ожидали бы в простой обработке C (однопоточный).

+0

var iam имеет 3 значения. 1 -1 или 0. Давайте забудем о инструкции else. Я проверил со значением -1, а последняя строка (iam = -999) была комментарием. Никогда не включается в первое, если заявление. Но если я раскомментирую iam = -999; он переходит к первому, если. Я знаю, это звучит странно. Я могу опубликовать скриншоты, если вы хотите. Я не знаю, это что-то о потоках cuda. – fikos

+0

@fikos Нам нужно будет увидеть код вокруг этого. Что такое iam, как? Это int, короткий, без знака? Откуда вы знаете, что iam установлен в -1 и не подхвачен первым оператором if? Как у вас установлен counter_alive? – sabbahillel

Смежные вопросы