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

时间:2018-05-30 16:35:26

标签: cuda integer-overflow ptx

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

1 个答案:

答案 0 :(得分:1)

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

特殊情况

这些指令使用了一些非直接在CUDA中提供的PTX指令(AFAICT);你需要使用内联PTX实现的包装函数来使用它们。

有符号的32位值

如果同时使用the add.s32 and add.sat.s32 operatorssub.s32sub.sat.s32运算符,则比较结果会告诉您是否溢出。还有融合乘法加法,如果你想检查溢出超过32位(如果你想要检查32位的溢出,那么如果对32位有符号值进行了加法,则可以比较mad.sat.s32mad.lo.s32不太考虑溢出真的)。为了更好地理解lo在这种情况下的含义,请继续阅读。

乘法

对于乘法,假设结果是操作数的两倍,则在PTX中“避免”溢出。到PTX multiplication instructions mad(实际上,它是乘法和加法)允许获得结果的高/低位,或者如果操作数是16位或32位宽,则获得整个双宽度输出。所以你可以使用mad.hi.yourtype并确保它是全零(或者全值为负值乘法)。

一般案例的缓慢方法

缓慢但通用的解决方案是将结果的粗略估计与实际结果进行比较。举个例子。您将获得两个操作数的较高一半位并将其加起来。如果结果本身远离溢出(或下溢),则低位的任何值都无法使其溢出,这表示“当然溢出”,如果它本身溢出到过半位,“肯定没有溢出”溢出,或“可能溢出”,在这种情况下,你只需要确保结果的较高一半足够接近估计的较高一半。

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