Вы не видите начальное значение переменной 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 (однопоточный).
@talonmies: Как вы знаете, вопрос не имеет ничего общего с C или C++? Как бы то ни было, я бы предпочел предположить, что это так, но может и не иметь никакой связи с CUDA. :) – tera
@tera: Потому что это просто спам для тегов, вот почему. И я бы предпочел просто удалить теги тихо, вместо того, чтобы принести один из обычных C или C++ сердитых троллей, удалить их и начать пламенную войну в то же время. – talonmies
А, ок. В любом случае, это было вмятина. @fikos: вам действительно нужно предоставить [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). – tera