Hard and soft float

Материал из Toshiba AC100 wiki
Перейти к навигации Перейти к поиску

Hard float and soft float, в чем разница?

В составе многих современных процессоров существует модуль операций с плавающей запятой ( или с плавающей точкой; англ. floating point unit (FPU)) — часть процессора для выполнения широкого спектра математических операций над вещественными числами. Если на этапе компиляции программы указать компилятору, что у процессора, под который собирается программа, есть FPU, то программа сможет использовать его напрямую, что положительно сказывается на производительности. Это называется сборкой под Hard float. Так же существуют процессоры, у которых такой блок отсутствует, потому программы скомпилированные с использованием инструкций FPU на них работать не будут. Чтобы программа работала на любых процессорах, вне зависимости от наличия в них FPU, необходимо запретить компилятору использовать инструкции FPU для сборки программы, даже если он есть. Это серьезно снижает скорость работы программы, но дает возможность компилировать программу под более широкий спектр оборудования. Такая сборка называется soft: полная программная эмуляция FPU( Full software floating point). Однако, если попытаться запустить программу скомпилированную под soft на процессоре с FPU, система собранная с soft point все же будет использовать данный модуль, однако расходы на непрямое использования блока получаются весьма существенными. Для среднестатистического приложения они составляют от 5 до 40%, а если приложение активно использует вычисления с плавающей точкой, то и до 200%!

Подведем итоги.<range type="comment" id="808311">В системе собранной с Hardfp работают только приложения собранные для работы на процессорах с FPU</range id="808311">, зато быстро. В системе собранной с Softfp работают приложения собранные для работы на любых процессорах(soft), вне зависимости от наличия FPU, зато медленнее. Приложения собранные с Hardfp на системе собранной с softfp не работают.

Как отличить

readelf -a /usr/bin/ar

-- with-float=soft

File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3-D16
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_DIV_use: Not allowed

-- with-float=softfp

File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3-D16
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_DIV_use: Not allowed

-- with-float=hard

File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3-D16
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_VFP_args: VFP registers
Tag_DIV_use: Not allowed

Ссылки по теме:

http://wiki.debian.org/ArmHardFloatPort#VFP http://wiki.debian.org/ArmHardFloatPort#Performance_improvements_and_benchmarks http://wiki.debian.org/ArmHardFloatPort/VfpComparison softfp: To reiterate, function calls are generated to pass FP arguments in integer registers hard: FP arguments are passed directly in FPU registers https://wiki.ubuntu.com/Mobile/ARMv7AndThumb https://wiki.linaro.org/Linaro-arm-hardfloat