CUDA内核中未定义的分区 - 有什么想法吗?

时间:2012-10-18 17:07:30

标签: math cuda divide-by-zero

刚刚编写CUDA内核时,我有机会测试以下代码的结果:

unsigned char temp1 = 0x00;
unsigned char temp2 = 0x00;
unsigned char temp3 = temp1/temp2;

printf("%02X", temp3);`

此代码打印“0xFF”。我对此非常困惑,任何人都可以提供解释吗?

1 个答案:

答案 0 :(得分:8)

根据C / C ++标准,整数除以零的结果是未定义的。参见C99第6.5.5节,例如:

  

/运算符的结果是来自分区的商   第一个操作数由第二个操作数; %运算符的结果是   剩余。在两个操作中,如果第二个操作数的值是   零,行为未定义

在除以零的情况下,NVIDIA GPU上的整数除法运算符返回一个结果,所有位都设置为1.这可能是为了与DirectX兼容。这同样适用于除数为零的模运算符。当所有操作数都是文字常量时,您可能会观察到不同的结果,因为这些情况可能是编译器优化器在编译时处理的。

在任何情况下,CUDA程序员都应该将这些结果视为实现工件,因为任何时候都不能以任何方式依赖未定义的行为。