2017-01-09 247 views
-3

我有一个很奇怪的错误。我正在Cuda编写一个模拟康威生命游戏的程序。我将二维数组转换为设备,并且有一个if-case来检查状态的线程。NVIDIA Cuda if语句

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

@talonmies:你怎么知道这个问题与C或C++无关?就目前而言,我宁愿怀疑它的确存在,但根本不可能与CUDA有任何关系。 :) – tera

+1

@tera:因为它只是标签垃圾邮件,这就是为什么。而且我宁愿只是悄悄地去掉标签,而不是让通常的C或C++愤怒的巨魔之一过来并将其移除并同时启动火焰战争 – talonmies

+0

好的。请注意,无论如何,这都是嘟嘟tong tong的。 @fikos:您确实需要提供[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 – tera

回答

1

您不显示变量iam或counter_alive的初始值。让我们假设编译器将其设置为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.让我们忘记其他语句。我检查了值-1和最后一行(iam = -999)是评论。绝不要先输入if语句。但如果我将取消注释iam = -999;它进入第一个如果。我知道这听起来很奇怪。如果你愿意,我可以发布截图。我不知道这是否与cuda线程有关。 – fikos

+0

@fikos我们必须看到这个代码。 IAM定义为什么?它是一个整数,一个简短的,未签名的?你怎么知道iam被设置为-1而不是被第一个if语句拾起?你如何设置counter_alive? – sabbahillel