<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM處理器Linux下浮點運算單元運用

          ARM處理器Linux下浮點運算單元運用

          作者: 時間:2016-11-21 來源:網(wǎng)絡 收藏
          1). 浮點運算單元(FPU)簡介

          Float Point Unit,浮點運算單元是專用于浮點運算的協(xié)處理器,在計算領域,例如三角函數(shù)以及時域頻域變換通常會用到浮點運算。當CPU執(zhí)行一個需要浮點數(shù)運算的程序時,有三種方式可以執(zhí)行:軟件仿真器(浮點運算函數(shù)庫)、附加浮點運算器和集成浮點運算單元。區(qū)別于以往的ARM9處理器,目前基于Cortex構架的ARM處理均集成了浮點運算單元。如Nvidia Tegra 2, Tegra 3和 NXP/Freescale i.MX 6集成了VFPv3浮點運算單元,NXP/Freescale i.MX 7 則集成了VFPv4浮點運算單元。ARM 浮點架構 (VFP) 為半精度、單精度和雙精度浮點運算中的浮點操作提供硬件支持。它完全符合 IEEE 754 標準,并提供完全軟件庫支持,與 NEONTM 多媒體處理功能結合使用時,可增強圖像應用程序的性能(如縮放、2D 和 3D 轉換、字體生成和數(shù)字過濾)。

          本文引用地址:http://www.ex-cimer.com/article/201611/319520.htm

          2). 浮點調用約定(Calling Convention)

          調用約定由應用二進制接口(Application Binary Interface, ABI)來定義參數(shù)是如何在調用過程中傳遞以及如何獲取返回值,對于ARM CPU常用的ABI為EABI,提供了兩種互相不兼容的方式來傳遞浮點數(shù):

          調用約定

          描述

          GCC flag

          EABI soft-float

          Floats are passed in normal (integer) registers.

          -mfloat-abi=soft or -mfloat-abi=softfp

          EABI hard-float

          Floats are passed in floating point registers (VFP).

          -mfloat-abi=hard

          通常交叉編譯ToolChain已經(jīng)配置好所需的ABI而無需在命令行重新設置,并且ToolChain提供的庫也已經(jīng)自動配置為對應的數(shù)據(jù)格式。

          兩個二進制文件(如可執(zhí)行文件和C庫文件)使用不同的調用約定,相互之間是不兼容的。所有的程序和庫必須遵循同一個調用約定進行編譯,要么軟浮點,要么硬浮點。如果你試圖在一個基于硬浮點編譯的平臺上運行一個基于軟浮點的程序時,會出現(xiàn) " No such file or directory " 錯誤,盡管這這個文件是存在的并且可以執(zhí)行。

          另外,硬浮點調用約定需要使用浮點運算單元(FPU)的寄存器,因此在不帶有浮點運算單元寄存器的處理器上則無法實現(xiàn)。

          下面列出Toradex Colibri Tegra ARM 計算機模塊 BSP 上所采用的調用約定

          BSP Version

          Calling Convention

          BSP V1.x

          EABI soft-float

          BSP V2.x and later

          EABI hard-float

          3). 協(xié)處理器/硬件引擎

          如本文開篇所述,目前基于Cortex架構的ARM處理器都內置了浮點運算單元(FPU)來加速浮點數(shù)據(jù)操作,通常浮點運算單元會添加額外的指令到現(xiàn)有的指令集中。于此相關的NEON指令集添加了單指令多數(shù)據(jù)操作(single instruction act on multiple data ,SIMD),它實現(xiàn)的是NEON 媒體處理器引擎,提供了基于VFPv3指令集的浮點運算單元功能。

          更多介紹請參考:

          - en.wikipedia.org/wiki/ARM_architecture

          - wiki.debian.org/ArmHardFloatPort/VfpComparison

          ./ Toradex Colibri產品系列所提供的協(xié)處理器/硬件引擎

          Module/CPU family

          VFP Unit

          NEON unit

          Colibri PXA(1)

          -

          -

          Colibri/Apalis iMX6

          VFPv3

          Yes

          Colibri T20

          VFPv3-D16

          -

          Colibri/Apalis T30

          VFPv3

          Yes

          Colibri VFxx

          VFPv3

          Yes

          1. 注:PXA 系列核心板沒有硬件浮點運算單元,但是GCC編譯器提供了經(jīng)過優(yōu)化的基于Intel Integer SIMD extension(iWMMXt)的軟浮點運算仿真功能。

          4). 編譯器選項

          相關介紹請見如下,下面同樣以Toradex產品為例:

          gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/ARM-Options.html#ARM-Options

          ./ Toradex Colibri Tegra 系列 BSP 編譯器選項

          BSP Version

          GCC flag

          BSP V1.x

          -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16

          BSP V2.x and later

          -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16

          ./ Toradex Colibri PXA編譯器選項

          使用軟浮點調用約定編譯器,同時編譯器選項不能包含F(xiàn)PU相關,產生的代碼中不包含由FPU來執(zhí)行的指令,而是依賴于CPU整數(shù)指令集基于相關庫進行運算。

          ----------------------------------------------------------------------------------------

          -march=armv5te -mtune=xscale -O3

          ----------------------------------------------------------------------------------------

          ./ Toradex Colibri T20編譯器選項

          產生的代碼兼容于含NEON 協(xié)處理器的CPU 。取決于在mfloat-abi 選項所配置的調用約定為"softfp" 還是"hard"

          ----------------------------------------------------------------------------------------

          -march=armv7-a -mfloat-abi=xxx -mfpu=vfpv3-d16 -mtune=cortex-a9 -O3

          ----------------------------------------------------------------------------------------

          ./ Toradex Colibri/Apalis i.MX6/T30編譯器選項

          取決于在mfloat-abi選項所配置的調用約定為"softfp" 還是"hard"

          ----------------------------------------------------------------------------------------

          -march=armv7-a -mfloat-abi=xxx -mfpu=neon -mtune=cortex-a9 -O3

          ----------------------------------------------------------------------------------------

          ./ Toradex Colibri VFxx編譯器選項

          取決于在mfloat-abi選項所配置的調用約定為"softfp" 還是"hard",未來可以通過更多的mfpu 選項來優(yōu)化NEON的實現(xiàn)。

          ----------------------------------------------------------------------------------------

          -march=armv7-a -mfloat-abi=xxx -mfpu=neon -mtune=cortex-a5 -O3

          ----------------------------------------------------------------------------------------

          5). 檢測一個二進制文件的浮點調用約定

          同樣以Toradex產品為例,其所發(fā)布的Linux Images 所有的object 目標文件都使用ELF,詳細介紹請參考:

          en.wikipedia.org/wiki/Executable_and_Linkable_Format

          首先架構信息(如i686 或者ARM)可以通過" file afile "程序來獲取,架構相關屬性信息可以通過" readelf –A afile "程序來獲取 (原生或者交叉編譯ToolChain都可以使用readelf)

          如果readelf命令輸出信息里面包含"Tag_ABI_VFP_args: VFP registers",則調用約定為硬浮點;如沒有,則為軟浮點。

          ./ 以Colibri T20 編譯的共享目標文件為例

          •使用 VFPv3-D16 指令和寄存器

          •不使用 SIMD extensions

          •硬調用約定

          ---------------------------------------------------------------------------------------------------------------------------------------------------

          $ file colibri-t20/usr/lib/libcurl.so.5.3.0

          colibri-t20/usr/lib/libcurl.so.5.3.0: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

          $ readelf -A colibri-t20/usr/lib/libcurl.so.5.3.0

          Attribute Section: aeabi

          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_CPU_unaligned_access: v6

          ---------------------------------------------------------------------------------------------------------------------------------------------------

          ./ 以NXP/Freescale Vybrid 編譯的共享目標文件為例

          •使用 VFPv3 指令和寄存器

          •使用用 NEON SIMD extensions

          •軟調用約定

          ---------------------------------------------------------------------------------------------------------------------------------------------------

          $ file twr-vf65gs10/usr/lib/libcurl.so.5.3.0

          twr-vf65gs10/usr/lib/libcurl.so.5.3.0: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

          $ readelf -A twr-vf65gs10/usr/lib/libcurl.so.5.3.0

          Attribute Section: aeabi

          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

          Tag_Advanced_SIMD_arch: NEONv1

          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_CPU_unaligned_access: v6

          ---------------------------------------------------------------------------------------------------------------------------------------------------

          ./ 以Colibri PXA 編譯的共享目標文件為例

          •不使用浮點運算單元

          •不使用SIMD extensions

          •軟調用約定

          ---------------------------------------------------------------------------------------------------------------------------------------------------

          $ file colibri-pxa/usr/lib/libcurl.so.5.3.0

          colibri-pxa/usr/lib/libcurl.so.5.3.0: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

          $ readelf -A colibri-pxa/usr/lib/libcurl.so.5.3.0

          Attribute Section: aeabi

          File Attributes

          Tag_CPU_name: "5TE"

          Tag_CPU_arch: v5TE

          Tag_ARM_ISA_use: Yes

          Tag_THUMB_ISA_use: Thumb-1

          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_align8_neededU: Yes

          Tag_ABI_align8_preserved: Yes, except leaf SP

          Tag_ABI_enum_size: int

          ------------------------------------------------------------------------------------------------------------------------------------------------------



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();