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

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".我对此极为困惑,有人可以提供解释吗?

nju*_*ffa 8

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

/运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数.在这两个操作中,如果第二个操作数的值为零,则行为未定义

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

无论如何,CUDA程序员应该将这些结果视为实现工件,因为任何时候都不能以任何方式依赖于未定义的行为.