如何检查CUDA中整数算术的溢出?

如何检查CUDA中整数算术的溢出?,cuda,integer-overflow,ptx,Cuda,Integer Overflow,Ptx,在CUDA中,如何确定上一次整数算术运算是否溢出/下溢?我可以得到溢出标志的值吗?一个部分答案,或者我到目前为止的想法: 特例 这些利用了一些在CUDA中无法直接获得的PTX指令(AFAICT);您需要使用内联PTX实现的包装器函数来使用它们 有符号32位值 如果同时使用这两个运算符,或者使用sub.s32和sub.sat.s32运算符,则比较结果会告诉您是否溢出。也有融合乘法加法,如果32位有符号值有一个 MAD.SAT.S32 和一个 MAD.L.S32 < /C> >,如果你想检查溢出超过

在CUDA中,如何确定上一次整数算术运算是否溢出/下溢?我可以得到溢出标志的值吗?

一个部分答案,或者我到目前为止的想法:

特例 这些利用了一些在CUDA中无法直接获得的PTX指令(AFAICT);您需要使用内联PTX实现的包装器函数来使用它们

有符号32位值 如果同时使用这两个运算符,或者使用
sub.s32
sub.sat.s32
运算符,则比较结果会告诉您是否溢出。也有融合乘法加法,如果32位有符号值有一个<代码> MAD.SAT.S32 和一个<代码> MAD.L.S32 < /C> >,如果你想检查溢出超过32位(你可能不太考虑溢出),你可以比较它。要更好地理解
lo
在本文中的含义,请继续阅读

乘法 对于乘法,通过假设结果的宽度是操作数的两倍,可以在PTX中“避免”溢出。对于(实际上是乘法和加法)允许只获取结果的高/低位,或者如果操作数是16位或32位宽,则获取整个双宽度输出。因此,您可以只使用
mad.hi.yourtype
,并确保它都是零(或者负值乘法都是1)

一般情况下的缓慢方法 一个缓慢但通用的解决方案是将结果的粗略估计与实际结果进行比较。以加法为例。将两个操作数的位的上半部分相加。这将表明,如果其本身溢出到1/2位,则为“肯定溢出”,如果结果远未溢出(或下溢),则为“肯定无溢出”,因为较低位的任何值都不能使其溢出,或者为“可能溢出”,在这种情况下,您只需要确保结果的上半部分与估计的上半部分足够接近

这在任何处理器上都是可行的,但如果您能做得更好,就应该真正避免