0

我得到了这个非常奇怪的行为,我的 cuda 程序崩溃取决于我内核中的 if 子句。这段代码工作正常(相同的指令,可能编译器对此进行了优化?):

... 
if( value == 0 )
{
  result = make_float4(0,0,1,0.01);
}
else
{
  result = make_float4(0,0,1,0.01);
}
...

改成这个

... 
if( value == 0 )
{
  result = make_float4(0,0,1,0.01);
}
else
{
  result = make_float4(1,0,1,0.01);
}
...

调用下一个内核时,使我的程序因未指定的启动失败而崩溃。问题似乎确实是条件执行而不是result的值。检查 cudaGetLastError() 不会返回错误。

任何人都遇到过类似的问题,或者是否有类似线程发散限制的东西?知道如何进一步调试吗?

4

1 回答 1

0

在对我的问题的评论的帮助下,我自己找到了答案:代码中的错误早在之前。价值的计算是个问题。在那里,我做了一个数组越界访问,当 if 条件中的两个语句相同时,编译器似乎优化了它。

这个:

...
int value = stupidArray[wrongIndex];

if( value == 0 )
{
  result = make_float4(0,0,1,0.01);
}
else
{
  result = make_float4(0,0,1,0.01);
}
...

对此进行了优化:

...
result = make_float4(0,0,1,0.01);
...

所以在这种情况下没有产生错误。

于 2013-04-15T08:20:19.400 回答