Денормализованные числа с плавающей запятой: какие операции вызывают дорогостоящие особые случаи?

Денормализованные числа с плавающей запятой требуют дорогостоящей специальной обработки в некоторых операциях (сложения, умножения). Хотя это хорошо известно, мне кажется, что на многие сравнительно простые операции такой штраф не повлияет. Мне не удалось найти хороший обзор того, что безопасно на разных платформах, и мне было интересно, знают ли другие здесь больше. Меня особенно интересует ответ для x86-64 и CUDA/PTX для следующих классов операций.

  • Сравнение с плавающей запятой
  • Абсолютная величина
  • Операции скругления (потолок, пол, ствол, скругление)
  • Преобразование (одиночное ↔ двойное, плавающее ↔ целое)

person Wenzel Jakob    schedule 05.07.2020    source источник
comment
Это не то же самое на всех процессорах x86-64; разные микроархитектуры разные. (Я резюмировал некоторые из них в Снижении производительности: денормализованные числа по сравнению с неправильными прогнозами ветвей). В x86-64 есть FTZ/DAZ, чтобы отключить постепенное недополнение и получить 0.0 вместо субнормаль, избегая всех штрафов за производительность на всех микроархитектурах. Абсолютное значение выполняется с помощью побитового И, чтобы очистить бит знака на x86-64 (математика SSE2 fp), поэтому собственно FPU даже не задействован. Преобразование в целое число всегда быстрое, даже на старых процессорах, таких как Core2, которые имеют штрафы в других случаях.   -  person Peter Cordes    schedule 05.07.2020
comment
Спасибо за комментарий и ссылку! Для x86-64 меня интересовало бы поведение недавних uarch (›= Skylake) и предположение, что FTZ/DAZ не используются.   -  person Wenzel Jakob    schedule 06.07.2020
comment
docs.nvidia.com/cuda/floating-point/index.html   -  person talonmies    schedule 06.07.2020
comment
@talonmies: этот документ на самом деле не отвечает на вопрос, который я задал, о влиянии производительности на определенные операции.   -  person Wenzel Jakob    schedule 07.07.2020