首页 > 解决方案 > 如何检查 CUDA 中的整数算术溢出?

问题描述

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

标签: cudainteger-overflowptx

解决方案


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

特别案例

这些使用了一些 PTX 指令,这些指令在 CUDA 中不(AFAICT)直接可用;您需要使用内联 PTX 实现的包装函数才能使用它们。

带符号的 32 位值

如果您同时使用andadd.s32运算add.sat.s32sub.s32andsub.sat.s32运算符,比较结果会告诉您是否溢出。还有融合乘加,如果对 32 位有符号值执行此操作,则可以比较 amad.sat.s32和 a mad.lo.s32,如果您想检查 32 位上的溢出(您可能不会真正考虑溢出)。为了更好地理解lo在这种情况下的含义,请继续阅读。

乘法

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

一般情况下的缓慢方法

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

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


推荐阅读