pg1*_*989 1 math cuda divide-by-zero
在刚刚编写CUDA内核时,我有机会测试以下代码的结果:
unsigned char temp1 = 0x00;
unsigned char temp2 = 0x00;
unsigned char temp3 = temp1/temp2;
printf("%02X", temp3);`
Run Code Online (Sandbox Code Playgroud)
此代码打印"0xFF".我对此极为困惑,有人可以提供解释吗?
根据C/C++标准,整数除以零的结果是未定义的.例如,见C99第6.5.5节:
/运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数.在这两个操作中,如果第二个操作数的值为零,则行为未定义
在除以零的情况下,NVIDIA GPU上的整数除法运算符返回结果,所有位都设置为1.这可能是为了与DirectX兼容.这同样适用于除数为零的模运算符.当所有操作数都是文字常量时,您可能会观察到不同的结果,因为这些情况可能是编译器优化器在编译时处理的.
无论如何,CUDA程序员应该将这些结果视为实现工件,因为任何时候都不能以任何方式依赖于未定义的行为.