在CUDA中使用内在类型转换的奇怪错误

时间:2012-11-18 12:09:14

标签: c++ casting cuda

我无法弄清楚以下代码之间的区别是什么:

int t = __double2int_rd(pos.x/params.cellSize.x*2.0)&1;
if( t ==0) {...}

if(__double2int_rd(pos.x/params.cellSize.x*2.0)&1 == 0) {...}

第二个选项永远不会返回true,而第一个选项的行为与预期一致。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:2)

第二个表达式首先计算结果始终为false的(1==0)。然后ANDs使用函数__double2int_rd的结果。

因此它实际上评估:

if(__double2int_rd(pos.x/params.cellSize.x*2.0) & 0)

这总是错误的。

第一个表达式的等价物是:

if((__double2int_rd(pos.x/params.cellSize.x*2.0) & 1) == 0)

注意括号。 如果你不确定表达式的评估顺序,它是一个很好的编程实践来添加括号。