Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Система с плавающей запятой без дополнений будет содержать только нормализованные числа (обозначенные красным). Разрешение денормализованных чисел (синий) расширяет диапазон системы.

В информатике , denormal число или денормализованные числа (теперь часто называют номера субнормальных ) заполняют сгущенный зазор вокруг нуля в арифметиках с плавающей точкой . Любое ненулевое число с величиной меньше наименьшего нормального числа является субнормальным .

В нормальном значении с плавающей точкой, нет ведущих нулей в мантиссах ; скорее, начальные нули удаляются путем корректировки показателя степени (например, число 0,0123 будет записано как 1,23 × 10 -2 ). Денормальные числа - это числа, в которых такое представление приведет к показателю степени ниже наименьшего представимого показателя степени (показатель степени обычно имеет ограниченный диапазон). Такие числа представлены с использованием ведущих нулей в мантиссе.

Мантисса (или мантисса) числа с плавающей запятой IEEE - это часть числа с плавающей запятой, которая представляет значащие цифры . Для положительного нормализованного числа оно может быть представлено как m 0 . m 1 m 2 m 3 ... m p −2 m p −1 (где m представляет собой значащую цифру, а p - точность) с ненулевым m 0 . Обратите внимание, что для двоичной системы счисления, ведущая двоичная цифра всегда равна 1. В денормальном числе, поскольку показатель степени является наименьшим из возможных, ноль является ведущей значащей цифрой (0. m 1 m 2 m 3 ... m p −2 m p - 1 ), позволяя представлять числа ближе к нулю, чем наименьшее нормальное число. Число с плавающей запятой может быть признано денормальным, если его показатель степени является наименьшим возможным значением.

При заполнении промежутка потери значимости таким образом значимые цифры теряются, но не так резко, как при использовании сброса до нуля при подходе потери значимости (отбрасывание всех значимых цифр при достижении потери значимости). Следовательно, получение денормального числа иногда называют постепенным истощением, потому что это позволяет расчету медленно терять точность, когда результат мал.

В IEEE 754-2008 денормальные числа переименовываются в субнормальные числа и поддерживаются как в двоичном, так и в десятичном форматах. В двоичных форматах обмена субнормальные числа кодируются смещенным показателем 0, но интерпретируются значением наименьшего допустимого показателя степени, который на единицу больше (т. Е. Как если бы он был закодирован как 1). В десятичных форматах обмена они не требуют специального кодирования, поскольку формат напрямую поддерживает ненормализованные числа.

С математической точки зрения, нормализованные числа с плавающей запятой данного знака примерно логарифмически разнесены, и поэтому любой нормальный плавающий элемент конечного размера не может включать ноль . Денормальные числа с плавающей запятой представляют собой линейно разнесенный набор значений, который охватывает промежуток между отрицательными и положительными нормальными числами с плавающей запятой.

Фон [ править ]

Ненормальные числа обеспечивают гарантию того, что при сложении и вычитании чисел с плавающей запятой никогда не будет потери значимости; два соседних числа с плавающей запятой всегда имеют представимую ненулевую разницу. Без постепенного истощения, вычитание a  -  b может привести к потере значимости, даже если значения не равны. Это, в свою очередь, может привести к ошибкам деления на ноль, которые не могут возникнуть при использовании постепенного опустошения. [1]

Ненормальные числа были реализованы в Intel 8087 во время написания стандарта IEEE 754. Они были, безусловно, наиболее спорной функцией в формате КИС предложения , которое было в конечном счете принято, [2] , но эта реализация показала , что денормализованные числа могут быть поддержаны в практической реализации. Некоторые реализации модулей с плавающей запятой не поддерживают напрямую денормальные числа на оборудовании, а скорее ограничиваются какой-то программной поддержкой. Хотя это может быть прозрачно для пользователя, это может привести к тому, что вычисления, которые производят или используют денормальные числа, будут намного медленнее, чем аналогичные вычисления для нормальных чисел.

Проблемы с производительностью [ править ]

Некоторые системы аппаратно обрабатывают денормальные значения так же, как и нормальные значения. Другие оставляют обработку денормальных значений системному программному обеспечению («помощь»), обрабатывая только нормальные значения и ноль на оборудовании. Обработка денормальных значений в программном обеспечении всегда приводит к значительному снижению производительности. Когда денормальные значения полностью вычисляются аппаратно, существуют методы реализации, позволяющие обрабатывать их со скоростью, сравнимой с нормальными числами. [3] Однако скорость вычислений остается значительно сниженной на многих современных процессорах x86; в крайних случаях, инструкции с денормальными операндами могут выполняться в 100 раз медленнее. [4] [5]

Эта разница в скорости может представлять угрозу безопасности. Исследователи показали, что он предоставляет боковой канал синхронизации, который позволяет вредоносному веб-сайту извлекать содержимое страницы с другого сайта в веб-браузере. [6]

Некоторые приложения должны содержать код, чтобы избежать ненормальных чисел, либо для поддержания точности, либо во избежание снижения производительности некоторых процессоров. Например, в приложениях для обработки звука денормальные значения обычно представляют настолько тихий сигнал, что он находится за пределами диапазона человеческого слуха. Из-за этого распространенной мерой, позволяющей избежать отклонений от нормы на процессорах, где может возникнуть снижение производительности, является обнуление сигнала, когда он достигает ненормального уровня, или смешивание с очень тихим шумовым сигналом. [7] Другие методы предотвращения денормальных чисел включают добавление смещения постоянного тока, квантование чисел, добавление сигнала Найквиста и т. Д. [8] Так как расширение процессора SSE2 , Intelпредоставил такую ​​функциональность в аппаратном обеспечении ЦП, который округляет денормализованные числа до нуля. [9]

Отключение денормальных чисел с плавающей запятой на уровне кода [ править ]

Intel SSE [ править ]

Компиляторы Intel C и Fortran по умолчанию включают флаги денормального равного нуля (DAZ) и сброса в ноль (FTZ) для SSE для уровней оптимизации выше -O0. [10] Эффект DAZ состоит в том, чтобы обрабатывать денормальные входные аргументы для операций с плавающей запятой как ноль, а эффект FTZ - возвращать ноль вместо денормального числа с плавающей запятой для операций, которые приводят к денормальному числу с плавающей запятой, даже если входные аргументы сами по себе не денормальны. clang и gcc имеют разные состояния по умолчанию в зависимости от платформы и уровня оптимизации.

Не- C99 -совместимый метод позволяет флаги DAZ и ЗСТ на мишенях , поддерживающих SSE приведен ниже, но не так широко поддерживается. Известно, что он работает на Mac OS X по крайней мере с 2006 года. [11]

#include  <fenv.h>#pragma STDC FENV_ACCESS ON // Устанавливает DAZ и FTZ, сбивая другие настройки CSR. // См. Https://opensource.apple.com/source/Libm/Libm-287.1/Source/Intel/, fenv.c и fenv.h. fesetenv ( FE_DFL_DISABLE_SSE_DENORMS_ENV ); // fesetenv (FE_DFL_ENV) // Отключить оба, сбивая другие настройки CSR.

Для других платформ с набором инструкций SSE, где библиотека C еще не реализовала вышеуказанный флаг, может работать следующее: [12]

#include  <xmmintrin.h>_mm_setcsr ( _mm_getcsr ()  |  0x0040 );  // DAZ _mm_setcsr ( _mm_getcsr ()  |  0x8000 );  // FTZ _mm_setcsr ( _mm_getcsr ()  |  0x8040 );  // Оба _mm_setcsr ( _mm_getcsr ()  &  ~ 0x8040 );  // Отключить оба

_MM_SET_DENORMALS_ZERO_MODEИ _MM_SET_FLUSH_ZERO_MODEмакросы завернуть более читаемый интерфейс для приведенного выше кода. [13]

// Чтобы включить DAZ #include  <pmmintrin.h>_MM_SET_DENORMALS_ZERO_MODE ( _MM_DENORMALS_ZERO_ON ); // Чтобы включить ЗСТ #include  <xmmintrin.h>_MM_SET_FLUSH_ZERO_MODE ( _MM_FLUSH_ZERO_ON );

Большинство компиляторов уже предоставляют предыдущий макрос по умолчанию, в противном случае можно использовать следующий фрагмент кода (определение для FTZ аналогично):

#define _MM_DENORMALS_ZERO_MASK 0x0040 #define _MM_DENORMALS_ZERO_ON 0x0040 #define _MM_DENORMALS_ZERO_OFF 0x0000#define _MM_SET_DENORMALS_ZERO_MODE (режим) \  _mm_setcsr ((_ mm_getcsr () & ~ _MM_DENORMALS_ZERO_MASK) | (режим)) #define _MM_GET_DENORMALS_ZERO_MODE () \  (_mm_getcsr () & _MM_DENORMALS_ZERO_MASK)

Денормальное поведение по умолчанию - ABI , и поэтому хорошо работающее программное обеспечение должно сохранять и восстанавливать денормальный режим перед тем, как вернуться к вызывающей стороне или вызвать ничего не подозревающий код библиотеки / ОС.

ARM [ править ]

AArch32 NEON (SIMD) FPU всегда использует режим сброса до нуля, который аналогичен FTZ + DAZ. Для скалярного FPU и в SIMD AArch64 сброс до нуля является необязательным и управляется битом FZ регистра управления - FPSCR в Arm32 и FPCR в AArch64.

Некоторые процессоры ARM имеют аппаратную обработку денормальных значений.

См. Также [ править ]

  • Логарифмическая система счисления

Ссылки [ править ]

  1. ^ Уильям Кахан. «Протокол собрания IEEE 754R, 2002 г.» . Архивировано из оригинального 15 октября 2016 года . Проверено 29 декабря 2013 года .
  2. ^ «Интервью со стариком с плавающей точкой» . Калифорнийский университет в Беркли.
  3. ^ Шварц, EM; Schmookler, M .; Сон Дао Чонг (июль 2005 г.). «Реализации FPU с денормализованными числами» (PDF) . Транзакции IEEE на компьютерах . 54 (7): 825–836. DOI : 10.1109 / TC.2005.118 . S2CID 26470540 .  
  4. ^ Дули, Исаак; Кале, Лаксмикант (12 сентября 2006 г.). «Количественная оценка помех, вызванных субнормальными значениями с плавающей запятой» (PDF) . Проверено 30 ноября 2010 .
  5. ^ Туман, Агнер. «Таблицы инструкций: списки задержек выполнения инструкций, пропускной способности и сбоев микроопераций для процессоров Intel, AMD и VIA» (PDF) . Проверено 25 января 2011 .
  6. ^ Андриско, Марк; Кольбреннер, Дэвид; Мауэри, Китон; Джхала, Ранджит; Лернер, Сорин; Шахам, Ховав. «О субнормальных числах с плавающей запятой и ненормальном времени» (PDF) . Проверено 5 октября 2015 .
  7. ^ Серрис, Джон (2002-04-16). «Денормализация Pentium 4: скачки производительности процессора в аудиоприложениях» . Архивировано из оригинального 25 февраля 2012 года . Проверено 29 апреля 2015 .
  8. ^ де Сорас, Лоран (2005-04-19). «Денормальные числа в приложениях обработки сигналов с плавающей запятой» (PDF) .
  9. ^ Кейси, Шон (2008-10-16). «x87 и SSE с плавающей запятой помогают в IA-32: очистка до нуля (FTZ) и ненормальное значение нуля (DAZ)» . Проверено 3 сентября 2010 .
  10. ^ «Библиотека Intel® MPI - Документация» . Intel.
  11. ^ "Re: проблема производительности Macbook pro" . Корпорация Apple Архивировано из оригинала на 2016-08-26.
  12. ^ "Re: изменение состояния с плавающей запятой (было: двойное против производительности с плавающей запятой)" . Корпорация Apple Архивировано из оригинала на 2014-01-15 . Проверено 24 января 2013 .
  13. ^ "Компилятор C ++ для Linux * Руководство пользователя систем" . Intel.

Дальнейшее чтение [ править ]

  • Эрик Шварц, Мартин Шмуклер и Сон Дао Чонг (июнь 2003 г.). «Аппаратные реализации денормализованных чисел» (PDF) . Труды 16-го симпозиума IEEE по компьютерной арифметике (Arith16) . 16-й симпозиум IEEE по компьютерной арифметике . Компьютерное общество IEEE . С. 104–111. ISBN 0-7695-1894-X.[ постоянная мертвая ссылка ]

См. Также различные статьи на веб-сайте Уильяма Кахана [1], где приведены примеры того, как денормальные числа помогают улучшить результаты вычислений.