色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

對比NEON匯編與NEON Intrinsics編程的優缺點

安芯教育科技 ? 來源:安謀科技學堂 ? 作者:安謀科技學堂 ? 2022-12-14 09:20 ? 次閱讀


本文選自極術專欄《Infrastructure開源軟件 on Arm》的Arm NEON學習系列。前面我們學習了如何快速上手開始NEON編程以及ArmNEON優化技術本篇我們將對比NEON匯編與NEON Intrinsics編程的優缺點

1.簡介

ARMNEON編程主要有兩種最常用的方式手寫匯編和Intrinsics。本文將對比NEON匯編與NEON Intrinsics編程的優缺點。

2.NEON匯編與Intrinsics

NEON匯編與Intrinsics各有優缺點:

47ea516c-7b4b-11ed-8abf-dac502259ad0.png

NEON匯編與Intrinsics各有優缺點:但實際情況遠遠比這些復雜很多,特別是涉及到ARM v7-A/v8-A跨平臺的時候。下面我們結合實例做一些更深入的分析。

2.1 編程

對于初學者來說,Intrinsics比較易學易用。但是對于有匯編經驗的開發者來說,可能更熟悉NEON匯編編程,切換到Intrinsics反倒需要有個適應過程。下文列出了實際開發中的一些問題。

2.1.1 指令靈活性

從指令使用角度來說,匯編指令比Intrinsics指令更靈活,主要體現在數據加載/存儲上,比如下例:

  • Intrinsics指令

    • 加載數據到一個64位寄存器 vld1_s8/u8/s16/u16/s32…etc

    • 加載數據到一個128位寄存器vld1q_s8/u8/s16/u16/s32…etc

  • ARM v7-A匯編

VLD1 { Dd}, [Rn]
VLD1 { Dd, D(d+1) }, [Rn]
VLD1 { Dd, D(d+1), D(d+2)}, [Rn]
VLD1 { Dd, D(d+1), D(d+2), D(d+3) }, [Rn]
  • ARM v8-A匯編

LD1 { .]
LD1 { ., .}, []
LD1 { ., ., . }, []
LD1 { ., ., ., . }, []

這個問題主要針對現在,相信隨著編譯器的升級這些問題會逐漸解決的。

在一些情況下,有的編譯器已經能把兩條指令解析成一條匯編指令,比如:


48055d4a-7b4b-11ed-8abf-dac502259ad0.png
因此,我們有理由由相信,隨著ARM v8-A編譯器的不斷升級,intrinsics指令會完善到跟匯編指令一樣靈活的。

2.1.2 寄存器分配

NEON匯編編程時,需要自己分配寄存器,用戶必須清楚寄存器的使用情況。而Intrinsics編程的一個好處就是,用戶只需要定義變量即可,編譯器會自動分配寄存器。這是優點,但有時也會變成弱點。實踐證明,因為ARMv7-A只有16個128位NEON寄存器,在Intrinsics編程時,如果用戶同時使用過多的NEON寄存器,會導致gcc編譯器的寄存器分配問題。主要表現是編譯器會把很多數據存儲到堆棧中,這樣會極大的影響程序性能。因此用戶在使用Intrinsics編程時要注意這個問題。在性能出現異常時(比如C程序的性能比NEON程序的性能要好),檢查反匯編,看是否有寄存器分配的問題出現。在ARM64中,有32個128位NEON寄存器,這個問題的影響大大減弱。

2.2 性能與編譯器

在同一平臺下,NEON匯編的性能與編譯器無關,只由NEON的實現方式決定。好處是用戶在調整代碼時,用戶可以預測、控制自己程序的性能,但沒有驚喜。

NEON Intrinsics 的性能則極大的依賴于編譯器,不同的編譯器,性能可能有極大的差別。一般來說,越老版本的編譯器,性能越差。如果用戶需要保留對老版本編譯器兼容性時,需要慎重考慮使用Intrinsics。此外,當用戶優化代碼細節的時候,編譯器的介入,使用戶很難預測程序性能的變化,但有時候會有驚喜,有時Intrinsics的性能會比匯編的性能要好。盡管很少見,但確實存在。

編譯器主要對優化NEON程序造成影響。下圖是NEON實現及優化的一般流程:

481e5a48-7b4b-11ed-8abf-dac502259ad0.png

對于NEON匯編或是Intrinsics來講,實現流程是一樣的,編程——調試——測試。但是調優的步驟是不一樣的。

NEON匯編的調優方式主要有:

? 改變實現方式,比如改變所用指令,調整并行方式。

? 調整指令順序,以降低數據依賴性

? 上文第二章所介紹的方式都可以嘗試

在匯編調優時,最精細方式是:

? 確定匯編指令數目和指令的時序

? 使用PMU (Performance Monitoring Unit)測量程序執行的周期數

? 根據使用指令的時序,調整程序,盡量減少指令延時

這種方式的缺點是,針對指定微架構的調整,換到另外的平臺性能不一定會好。經常花費很大的工作量而只能取得很小的性能提升。

NEON intrinsics的調優則比較困難,

? 嘗試NEON匯編所用的調優方式,然后

? 觀察反匯編,看看數據依賴性、寄存器使用等情況

? 判斷優化效果是否達到預期, 如果符合預期則工作結束。此時,需要測試多種編譯器,檢查性能的異同。

在使用intrinsics轉換ARMv7-A的匯編時,優化效果判斷比較簡單,只要Intrinsics性能接近匯編性能即可。但是,在使用Intrinsics優化ARM v8-A的代碼時,我們沒有性能參考的對象,較難判斷代碼是否調整到最優狀態了。可能會有疑問,會不會匯編實現的性能會更好?但隨著整個ARM v8-A環境的成熟,這個問題帶來的影響會越來越小。另外,如果更看重Intrinsics的其它優點,對性能也不是錙銖必較的話,這個問題的影響也不大。

2.3 跨平臺與可移植性

現在,現有的大部分NEON匯編代碼只能運行在ARM v7-A或是ARM v8-A AArch32模式的平臺上。想要運行在ARM v8-A AArch64模式的平臺,我們必須重寫代碼,這帶來了很大的工作量。這時,NEON Intrinsics代碼的好處就體現出來了,在ARM v8-A AArch64模式下,我們可以直接運行這些代碼,減少了重寫代碼的工作量。同時,我們可以只維護一套代碼,這樣也減少了維護的工作量。

然而,由于ARMv7-A/ARMv8-A的硬件資源不同,即使用Intrinsics,有時我們也需要兩套代碼。Ne10中FFT實現就是一個例子:

// radix 4 butterfly with twiddles
scratch[0].r = scratch_in[0].r;
scratch[0].i = scratch_in[0].i;
scratch[1].r = scratch_in[1].r * scratch_tw[0].r - scratch_in[1].i * scratch_tw[0].i;
scratch[1].i = scratch_in[1].i * scratch_tw[0].r + scratch_in[1].r * scratch_tw[0].i;
scratch[2].r = scratch_in[2].r * scratch_tw[1].r - scratch_in[2].i * scratch_tw[1].i;
scratch[2].i = scratch_in[2].i * scratch_tw[1].r + scratch_in[2].r * scratch_tw[1].i;
scratch[3].r = scratch_in[3].r * scratch_tw[2].r - scratch_in[3].i * scratch_tw[2].i;
scratch[3].i = scratch_in[3].i * scratch_tw[2].r + scratch_in[3].r * scratch_tw[2].i;

上述代碼描述了32位浮點復數FFT算法的基本元——基4蝶形運算。從代碼中我們可以看出:

? 如果在一次循環中,兩個基4蝶形運算并行,需要20個 64位寄存器。

? 如果在一次循環中,四個基4蝶形運算并行,需要20個 128位寄存器。

由于ARM v7-A只有16個128位寄存器,因此,該平臺的FFT實現僅能一次循環兩個基4蝶形運算并行。而ARM v8-A有32個128位寄存器,該平臺的FFT實現能一次循環四個基4蝶形運算并行。因此,即使用Intrinsics,我們也需要兩套代碼。

上例可以說明,在實現一套代碼跨ARM v7-A/v8-A平臺時,我們需要注意一些類似的特例。

2.4 將來

上面已經分析了NEON匯編與Intrinsics的很多問題,但是這些問題都是暫時的。長遠來看,使用intrinsics還是更好。Intrinsics能帶來硬件以及編譯器發展的好處。經典算法只要實現一次即可,不用隨著硬件的升級而重新編程,大大減少了工作量。

2.5 總結

結合實例,上文對NEON匯編和Intrinsics做了一些分析。總體來說,使用intrinsics利大于弊。特別是與匯編相比,Intrinsics更容易編程,且能夠更好地兼容ARMv7-A/ARMv8-A。

下面再總結一下NEON Intrinsics使用時的一些注意事項:

? 使用的寄存器數量

? 編譯器選擇

? 查看反匯編

3.總結

本文通過實際程序分析了NEON匯編與Intrinsics的優缺點。希望能對用戶在NEON實際開發中有些借鑒意義。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5357

    瀏覽量

    120591
  • 編程
    +關注

    關注

    88

    文章

    3623

    瀏覽量

    93798

原文標題:Arm NEON學習(三)NEON 匯編與Intrinsics編程

文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    不同類型adc的優缺點分析

    ADC(模數轉換器)是將模擬信號轉換為數字信號的電路,根據轉換原理和應用需求的不同,ADC可以分為多種類型,每種類型都有其獨特的優缺點,以下是對不同類型ADC的優缺點分析: 逐次逼近型ADC(SAR
    的頭像 發表于 11-19 16:58 ?922次閱讀

    開環和閉環功放的區別,優缺點,應用場合有什么不同?

    問下TI的工程師,開環和閉環功放的區別,優缺點,應用場合有什么不同?請解釋下,謝謝!
    發表于 11-04 06:33

    FPGA與ASIC的優缺點比較

    FPGA(現場可編程門陣列)與ASIC(專用集成電路)是兩種不同的硬件實現方式,各自具有獨特的優缺點。以下是對兩者優缺點的比較: FPGA的優點 可編程性強 :FPGA具有高度的可
    的頭像 發表于 10-25 09:24 ?514次閱讀

    雪崩晶體管有哪些優缺點

    雪崩晶體管作為一種特殊的半導體器件,在電子領域具有其獨特的優缺點
    的頭像 發表于 09-23 18:05 ?326次閱讀

    遠心鏡頭優點和缺點對比

    遠心鏡頭各有優缺點,根據實際所用場景領域。
    的頭像 發表于 09-03 16:38 ?747次閱讀
    遠心鏡頭優點和<b class='flag-5'>缺點</b><b class='flag-5'>對比</b>

    運放恒流源有哪些優缺點

    運放恒流源,即利用運算放大器(Operational Amplifier,簡稱運放)構成的恒流源電路,具有一系列獨特的優點和缺點。以下是對其優缺點的詳細分析。
    的頭像 發表于 08-28 10:18 ?1221次閱讀

    GaN HEMT有哪些優缺點

    GaN HEMT(氮化鎵高電子遷移率晶體管)作為一種先進的功率半導體器件,在電力電子、高頻通信、汽車電子等多個領域展現出了顯著的優勢,但同時也存在一些缺點。以下是對GaN HEMT優缺點的詳細分析:
    的頭像 發表于 08-15 11:09 ?1413次閱讀

    直流穩壓電源串并聯優缺點對比

    直流穩壓電源串并聯 的工作原理是擴大開關電壓和電流,實現電壓和電流的寬范圍調節,在實際應用中,串聯穩壓電源和并聯穩壓電源都有其優缺點。 ? 串并聯直流穩壓電源的優點和缺點 一、并聯穩壓電源的優點
    的頭像 發表于 07-17 17:59 ?1812次閱讀

    AI大模型與小模型的優缺點

    在人工智能(AI)的廣闊領域中,模型作為算法與數據之間的橋梁,扮演著至關重要的角色。根據模型的大小和復雜度,我們可以將其大致分為AI大模型和小模型。這兩種模型在定義、優缺點及應用場景上存在著顯著的差異。本文將從多個維度深入探討AI大模型與小模型的特點,并分析其各自的優缺點
    的頭像 發表于 07-10 10:39 ?2837次閱讀

    plc和單片機的優缺點對比

    在自動化控制系統中,PLC(可編程邏輯控制器)和單片機(Microcontroller,MCU)是兩種常見的控制器。它們在許多方面有所不同,各有優缺點。 定義與原理 PLC(Programmable
    的頭像 發表于 06-06 14:07 ?2113次閱讀

    nbiot和lora的優缺點是什么?

    nbiot和lora的優缺點
    發表于 06-04 06:37

    請問數字(硬件)I2C和模擬I2C的優缺點

    請教哈各位同仁: 1. 數字(硬件)I2C和模擬I2C的優缺點? 2.他們在正常模式下的功耗對比,哪個較好?
    發表于 05-13 06:10

    編程片上系統的優缺點

    編程片上系統(PSoC)作為一種靈活、高效的解決方案,具有顯著的優點和一些潛在的缺點
    的頭像 發表于 03-28 15:13 ?618次閱讀

    日本大帶寬服務器優缺點分析

    日本大帶寬服務器是很多用戶的選擇,那么日本大帶寬服務器優缺點都是什么?Rak部落小編為您整理發布日本大帶寬服務器優缺點分析。
    的頭像 發表于 03-22 10:08 ?479次閱讀

    帶你探索穩壓器的優缺點和選擇技巧

    TOREX特瑞仕(KOYUELEC光與電子):帶你探索穩壓器的優缺點和選擇技巧
    的頭像 發表于 01-24 10:35 ?894次閱讀
    帶你探索穩壓器的<b class='flag-5'>優缺點</b>和選擇技巧
    主站蜘蛛池模板: 久久视频这有精品63在线国产| 国内2018年午夜福利5678| 成人片在线播放| 美女扒开尿口直播| 永久免费毛片| 精品久久伦理中文字幕| 亚洲国产精品一区二区第一页 | 日韩一区二区三区四区区区| 4438全国免费观看| 男男h啪肉np文总受| 999久久免费高清热精品| 美女张开腿露尿口给男人亲 | WWW夜片内射视频在观看视频| 美女穿丝袜被狂躁动态图| 506070老熟肥妇bbwxx视频| 伦理片在线线249| 99热这里精品| 日本视频中文字幕一区二区 | 精品亚洲一区二区在线播放| 亚洲日韩中文字幕区| 久久久久久91香蕉国产| 51国产偷自视频在线视频播放| 美女诱惑性感揉胸| yellow高清免费观看日本| 日韩精品亚洲专区在线影院 | 国产精品视频在线自在线| 亚洲AV精品一区二区三区不卡| 好硬好湿好大再深一点动态图| 亚洲欧美日本中文子不卡| 久啪久久全部视频在线| gay吊粗大双龙| 天天躁夜夜踩很很踩2022| 火影小南被爆羞羞网站| 最近中文字幕高清中文| 青青国产在线观看视频| 国产精品免费一区二区三区视频| 亚州日韩精品AV片无码中文| 久久黄色片| 吃奶啃奶玩乳漫画| 亚洲人交性视频| 男女亲吻摸下面吃奶视频|