新聞中心

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

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

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

        Float Point Unit,浮點運算單元是專用于浮點運算的協處理器,在計算領域,例如三角函數以及時域頻域變換通常會用到浮點運算。當CPU執行一個需要浮點數運算的程序時,有三種方式可以執行:軟件仿真器(浮點運算函數庫)、附加浮點運算器和集成浮點運算單元。區別于以往的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 轉換、字體生成和數字過濾)。

        本文引用地址:http://www.104case.com/article/201611/319520.htm

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

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

        調用約定

        描述

        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已經配置好所需的ABI而無需在命令行重新設置,并且ToolChain提供的庫也已經自動配置為對應的數據格式。

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

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

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

        BSP Version

        Calling Convention

        BSP V1.x

        EABI soft-float

        BSP V2.x and later

        EABI hard-float

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

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

        更多介紹請參考:

        - en.wikipedia.org/wiki/ARM_architecture

        - wiki.debian.org/ArmHardFloatPort/VfpComparison

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

        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編譯器提供了經過優化的基于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編譯器選項

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

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

        -march=armv5te -mtune=xscale -O3

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

        ./ Toradex Colibri T20編譯器選項

        產生的代碼兼容于含NEON 協處理器的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 選項來優化NEON的實現。

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

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

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

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

        同樣以Toradex產品為例,其所發布的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

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 公安县| 丹寨县| 扶绥县| 大姚县| 即墨市| 台江县| 景泰县| 洞头县| 龙泉市| 南通市| 乐安县| 临海市| 衡阳市| 南安市| 闸北区| 呼图壁县| 怀柔区| 彰化市| 岚皋县| 浦城县| 剑河县| 宁晋县| 莱西市| 汶川县| 安泽县| 岑溪市| 秦安县| 积石山| 平遥县| 安吉县| 酒泉市| 新源县| 晋中市| 沧州市| 交口县| 镇赉县| 葫芦岛市| 扶余县| 乾安县| 治多县| 石泉县|