Частичный ответ, или то, о чем я думал до сих пор:
Особые случаи
В них используются некоторые инструкции PTX, которые (AFAICT) недоступны непосредственно в CUDA;вам потребуются функции-оболочки, реализованные с использованием встроенного PTX, чтобы использовать их.
32-битные значения со знаком
Если вы используете оба из add.s32
и add.sat.s32
операторы или операторы sub.s32
и sub.sat.s32
, сравнение результатов показывает, переполнили ли вы или нет.Также есть слитное умножение-сложение, которое, если оно сделано для 32-битных значений со знаком, имеет mad.sat.s32
и mad.lo.s32
, которые вы можете сравнить, если хотите проверить переполнение более 32-битных (которое вы, возможно, не совсем рассматриваете как переполнение).действительно).Чтобы лучше понять, что означает lo
в этом контексте, читайте дальше.
Умножение
Для умножения в PTX «избегают» переполнения, предполагая, что результат в два раза шире операндов.К инструкциям умножения PTX mad
(фактически, это умножение и сложение) разрешается либо получать только верхние / нижние биты результата, либо операнды имеют 16-битную или 32-битную ширину., получая весь вывод двойной ширины.Таким образом, вы можете просто использовать mad.hi.yourtype
и убедиться, что это все нули (или все единицы для умножения отрицательного значения).
Медленный подход для общего случая
Медленное, но общее решение состоит в сравнении грубой оценки результата с фактическим результатом.Возьмите дополнение к примеру.Вы бы высшую половину бит обоих операндов и сложить это.Это указывало бы либо на «однозначно переполнение», если оно само переполняется до полуразряда, «безусловно, без переполнения», если результат настолько далек от переполнения (или недостаточности), что никакие значения для младших битов не могут его сделатьпереполнение или «возможно переполнение», в этом случае вам просто нужно убедиться, что более высокая половина результата достаточно близка к предполагаемой более высокой половине.
Это выполнимо на любом процессоре, но его действительно следует избегатьесли вы можете сделать лучше.