поддержка субнормальных чисел с плавающей запятой IEEE 754 на устройствах iOS ARM (iPhone 4) - PullRequest
11 голосов
/ 08 сентября 2011

При портировании приложения с Linux x86 на iOS ARM (iPhone 4) я обнаружил разницу в поведении арифметики с плавающей запятой и малых значений.

64-разрядные числа с плавающей запятой (двойные) меньше чем [+/-] 2.2250738585072014E-308 называются денормальными / денормализованными / субнормальными числами в IEEE 754-1985 / IEEE 754-2008 standard.

На iPhone 4 такие небольшие числа рассматриваются как ноль (0), в то время как на x86 для вычисления могут использоваться субнормальные числа.

Я не смог найти ни одногообъяснение соответствия стандартам IEEE-754 в документации Apple Страница руководства Mac OS X Для float (3) .

Но благодаря некоторым ответам о переполнении стека ( flush-to-Нулевое поведение в арифметике с плавающей точкой , Двойное против поплавка на iPhone ), я нашел некоторые подсказки.

Согласно некоторым поискам, кажется, VFP (или NEON ) математический сопроцессор used вдоль ядра ARM использует режим Flush-To-Zero (FTZ) (например, субнормальные значения преобразуются в 0 на выходе) и режим Denormals-Are-Zero (DAZ) (например, субнормальные значения преобразуются в 0 при использовании в качестве входапараметры), чтобы обеспечить быстрые аппаратные вычисления IEEE 754.

  • Полное соответствие IEEE754 с кодом поддержки ARM
  • Режим Run-Fast для почти полного соответствия IEEE754 (только аппаратное обеспечение)

Хорошее объяснение FTZ и DAZ можно найти в x87 и SSE с плавающей запятой в IA-32: Flush-to-Zero (FTZ) и Denormals-Are-Zero (DAZ) :

Режимы FTZ и DAZ обрабатывают случаи, когда возникают недопустимые данные с плавающей запятой или обрабатываются в условиях недостаточного или ненормального состояния.[...].Разница между числом, которое обрабатывается FTZ и DAZ, очень тонкая.FTZ обрабатывает условия переполнения, в то время как DAZ обрабатывает ненормальные.Условие недостаточного потока возникает, когда вычисление приводит к денормализации.В этом случае режим FTZ устанавливает выходной сигнал на ноль.DAZ исправляет случаи, когда денормалы используются в качестве входных данных, либо в качестве констант, либо путем считывания недействительной памяти в регистры.Режим DAZ устанавливает входы вычисления в ноль перед вычислением.Тогда можно сказать, что FTZ обрабатывает [вывод], тогда как DAZ обрабатывает [ввод].

Единственное, что можно сказать о FTZ на сайте разработчиков Apple, - это Руководство по вызову функции iOS ABI :

Регистр состояния VFP |FPSCR |Специальный |Биты кода состояния (28-31) и биты насыщения (0-4) не сохраняются при вызове функции.Управление исключениями (8-12), режим округления (22-23) и биты сбрасывать до нуля (24) должны изменяться только конкретными подпрограммами, которые влияют на состояние приложения (включая функции API-интерфейса),Биты короткой векторной длины (16-18) и шага (20-21) должны быть равны нулю при входе и выходе из функции.Все остальные биты не должны быть изменены.

Согласно Техническому справочному руководству ARM1176JZF-S, 18.5 Режимы работы (первый процессор iPhone), VFP можно настроить для полной поддержкиIEEE 754 (не нормальная арифметика), но в этом случае потребуется некоторая программная поддержка (перехват в ядре для вычислений в программном обеспечении).

Примечание: я также прочитал ARM Hard Float Port Debian и Сравнение VFP страниц.

Мои вопросы:

  • Где можно найти окончательные ответы относительно обработки ненормальных чисел на устройствах iOS?

  • Можно ли настроить систему iOS на поддержку субнормальных чисел, не прося компилятор выдавать только полный программный код с плавающей запятой?

Спасибо.

Ответы [ 2 ]

9 голосов
/ 08 сентября 2011

Можно ли настроить систему iOS на поддержку поддержки ненормального числа, не прося компилятор выдавать только полный программный код с плавающей запятой?

Да.Это может быть достигнуто путем установки бита FZ в FPSCR на ноль:

static inline void DisableFZ( )
{
    __asm__ volatile("vmrs r0, fpscr\n"
                     "bic r0, $(1 << 24)\n"
                     "vmsr fpscr, r0" : : : "r0");
}

Обратите внимание, что это может привести к значительному замедлению производительности приложения при обнаружении значительных количеств ненормальных значений.Вы можете (и должны) восстановить состояние с плавающей запятой по умолчанию перед выполнением вызовов в любой код, который не дает ABI гарантии для правильной работы в режимах, отличных от стандартных:

static inline void RestoreFZ( ) {
    __asm__ volatile("vmrs r0, fpscr\n"
                     "orr r0, $(1 << 24)\n"
                     "vmsr fpscr, r0" : : : "r0");
}

Пожалуйста, отправьте отчет об ошибке с просьбой предоставить лучшую документацию для режимов работы FP в iOS.

0 голосов
/ 08 сентября 2011
•Where can one find definitive answers regarding subnormal numbers

обработка на устройствах iOS?

Вы уже нашли свой ответ.Предполагается, что ARM не обладает такими же возможностями с плавающей запятой.

• Можно ли настроить систему iOS на поддержку поддержки ненормального числа, не прося компилятор выдавать только полную программную плавающую точкукод?

Я не верю, по крайней мере, я бы на это надеялся получить разные числа, используя одно и то же значение.

...