Hard and soft float
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