0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

在Arm上使用向量數(shù)學(xué)函數(shù)

jf_9aVl32Dp ? 來源:Arm軟件開發(fā)者 ? 作者:Arm軟件開發(fā)者 ? 2023-05-28 09:21 ? 次閱讀

作者:Chris Goodyer 2023年5月16日

廣泛工作負載(包括許多基準測試,如SPEC)的性能依賴于基本數(shù)學(xué)例程的有效實現(xiàn)。這些例程可以通過矢量化和有效使用SIMD管道來利用性能。

最近的一篇博客文章(https://community.arm.com/arm-community-blogs/b/high-performance-computing-blog/posts/bringing-wrf-up-to-speed-with-arm-neoverse)描述了如何使用Arm Compiler for LinuxACfL)和Arm performance Library(Arm PL)中提供的SVE子程序來提高Neoverse V1上天氣預(yù)測模型的性能。

Arm優(yōu)化的標量和向量數(shù)學(xué)例程實現(xiàn)在Arm軟件/優(yōu)化例程中作為開源軟件公開提供(https://github.com/ARM-software/optimized-routines)。這些實現(xiàn)被方便地授權(quán),允許用戶在需要時直接將它們包含在其他項目中。此外,我們還將這些作為預(yù)編譯二進制文件發(fā)布,稱為Libamath,作為Arm PL和ACfL的一部分。

雖然ACfL能夠通過自動矢量化生成對矢量數(shù)學(xué)例程的調(diào)用(請參見https://developer.arm.com/documentation/101458/latest/有關(guān)使用“-fsimdmath”編譯器選項的更多詳細信息,其他編譯器可能還不允許在AArch64上發(fā)生這種情況。然而,將項目鏈接到Arm PL或在禁用自動矢量化的情況下使用ACfL構(gòu)建它仍然可以訪問矢量數(shù)學(xué)符號。Libamath隨ACfL提供,但作為單獨的庫,因此可以通過添加-lamath將項目鏈接到Libamath。

在這篇文章中,我們強調(diào)了性能可能增加的規(guī)模,詳細說明了精度要求,并詳細解釋了如何在自己的代碼中直接使用這些函數(shù)。

準確性和性能

Libamath例程的最大錯誤低于4個ULP,并且僅支持默認的舍入模式(舍入到最近,綁定到偶數(shù))。因此,與這些函數(shù)的其他矢量化實現(xiàn)類似,從libm切換到libamath會導(dǎo)致一系列例程的少量精度損失。

Neoverse V1系統(tǒng)的預(yù)期性能增益如以下2個單精度和雙精度例程圖所示。

15601026-fccc-11ed-90ce-dac502259ad0.png

15601026-fccc-11ed-90ce-dac502259ad0.png

命名和調(diào)用約定

Libamath標量例程的名稱與libm中使用的名稱相匹配,例如,單精度和雙精度指數(shù)分別稱為expf和exp。

每個向量例程都在向量ABI名稱下公開。AArch64的向量函數(shù)ABI(https://github.com/ARM-software/abi-aa/blob/2982a9f3b512a5bfdc9e3fea5d3b298f9165c36b/vfabia64/vfabia64.rst#451name-mangling-function)中定義的向量名稱篡改與glibc的向量ABI(https://sourceware.org/glibc/wiki/libmvec?action=AttachFile&do=view&target=VectorABI.txt)匹配(第2.6節(jié))。

例如,標量、Neon和SVE單精度指數(shù)的符號分別讀作expf、_ZGVnN4v_expf和_ZGVsMxv_expf。

向量ABI 在向量ABI中,向量函數(shù)名被篡改為以下各項的串聯(lián):

'_ZGV' '_'

其中

? :標量libm函數(shù)的名稱 ? :Neon為“n”,SVE為“s”

? :“M”表示屏蔽/謂詞版本,“N”表示無屏蔽。僅為SVE定義屏蔽例程,僅為Neon定義無屏蔽例程。

? :表示以車道數(shù)表示的矢量長度的整數(shù)。對于Neon,雙精度中=‘2’,單精度中=‘4’。對于SVE,=‘x’。

? :對于1個輸入浮點或整數(shù)參數(shù),“v”用于簽名,“vv”用于2個。有關(guān)更多詳細信息,請參見AArch64的向量函數(shù)ABI(https://github.com/ARM-software/abi-aa/blob/2982a9f3b512a5bfdc9e3fea5d3b298f9165c36b/vfabia64/vfabia64.rst#451name-mangling-function)。

示例

最新版本23.04開始,Arm Performance Libraries提供了文檔和示例程序,以展示用戶如何直接從其程序中調(diào)用矢量例程,而不依賴于自動矢量化。以下代碼片段說明了如何調(diào)用Neon雙精度sincos、SVE單精度pow和SVE雙精度erf。

所有標量和向量例程的聲明都在頭文件amath.h中提供。

#include 
 
int main(void) {
  // Neon cos and sin (using sincos)
  float64x2_t vx = (float64x2_t){0.0, 0.5};
  double vc[2], vs[2];
  _ZGVnN2vl8l8_sincos(vx, vs, vc);
  
  // SVE math routines
#if defined(__ARM_FEATURE_SVE)
  // single precision pow
  svbool_t pg32 = svptrue_b32();
  svfloat32_t svx = svdup_n_f32(2.0f);
  svfloat32_t svy = svdup_n_f32(3.0f);
  svfloat32_t svz = _ZGVsMxvv_powf(svx, svy, pg32);
 
  // double precision error function
  svbool_t pg64 = svptrue_b64();
  svfloat64_t svw = svdup_n_f64(20.0);
  svfloat64_t sve = _ZGVsMxv_erf(svw, svptrue_b64());
#endif
}

結(jié)論

使用Arm Compiler for Linux時,libamath通過依賴于編譯器的自動矢量化,為這些應(yīng)用程序提供了利用性能的潛力。這提供了所有math.h例程的Arm優(yōu)化Neon和SVE變體。我們的“優(yōu)化例程”(https://github.com/ARM-software/optimized-routines)開源代碼庫提供了對更廣泛使用的例程的最新優(yōu)化的訪問權(quán)限。這些矢量化算法已經(jīng)用于加速計算物理、機器學(xué)習(xí)網(wǎng)絡(luò)等各種應(yīng)用程序中的基本數(shù)學(xué)運算。當使用這兩種方法之一時,用戶還可以使用上面描述的接口直接從其代碼中調(diào)用這些矢量例程。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9029

    瀏覽量

    366536
  • SPEC
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    15771
  • 數(shù)學(xué)函數(shù)

    關(guān)注

    0

    文章

    9

    瀏覽量

    6330

原文標題:在Arm上使用向量數(shù)學(xué)函數(shù)

文章出處:【微信號:Arm軟件開發(fā)者,微信公眾號:Arm軟件開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    MATLAB常用的基本數(shù)學(xué)函數(shù)

    matlab! MATLAB常用的基本數(shù)學(xué)函數(shù) abs(x):純量的絕對值或向量的長度angle(z):復(fù)數(shù)z的相角(Phase angle)sqrt(x):開平方real(z):復(fù)數(shù)z的實部
    發(fā)表于 03-11 23:34

    XC32函數(shù)向量x到大

    用它時,鏈接器就抱怨VEC。Tor函數(shù)是大的。我缺少什么?向量間距由啟動代碼設(shè)置為8,MVEC啟用。我使用下面的ISR C代碼:下面的程序集:這是鏈接器的輸出:XC32-L.E.EX:異常
    發(fā)表于 10-26 16:09

    學(xué)習(xí)DSP庫的基本數(shù)學(xué)函數(shù)

    第11章 DSP基礎(chǔ)函數(shù)-絕對值,求和,乘法和點乘本期教程開始學(xué)習(xí)ARM官方的DSP庫,這里我們先從基本數(shù)學(xué)函數(shù)開始。本期教程主要講絕對值,加法,點乘和乘法四種運算。目錄第11章 DS
    發(fā)表于 08-17 07:13

    基于支持向量機的預(yù)測函數(shù)控制

    基于支持向量機的預(yù)測函數(shù)控制 Predictive Functional Control Based on Support Vector Machine
    發(fā)表于 03-17 09:24 ?21次下載

    基于先驗知識的支持向量圖像分割中的應(yīng)用

    文中研究現(xiàn)有先驗知識與支持向量機融合的基礎(chǔ),針對置信度函數(shù)憑經(jīng)驗給出的不足,提出了一種確定置信度函數(shù)方法,更好地進行分類。該方法是建立
    發(fā)表于 07-16 17:02 ?39次下載

    雙目標函數(shù)支持向量情感分析中的應(yīng)用

    雙目標函數(shù)支持向量情感分析中的應(yīng)用_劉春雨
    發(fā)表于 01-03 17:41 ?0次下載

    組合核函數(shù)多支持向量機的直線電機建模

    組合核函數(shù)多支持向量機的直線電機建模_趙吉文
    發(fā)表于 01-07 17:16 ?1次下載

    大數(shù)據(jù)中邊界向量調(diào)節(jié)熵函數(shù)支持向量機研究

    大數(shù)據(jù)中邊界向量調(diào)節(jié)熵函數(shù)支持向量機研究_林蔚
    發(fā)表于 01-07 19:08 ?0次下載

    發(fā)掘函數(shù)級單指令多數(shù)據(jù)向量化的方法

    當前面向單指令多數(shù)據(jù)( SIMD)擴展部件的兩類向量化方法分別是循環(huán)級向量化方法和超字級并行(SLP)方法。針對當前編譯器不能實現(xiàn)函數(shù)向量化的問題,提出一種基于靜態(tài)單賦值的
    發(fā)表于 11-29 16:08 ?0次下載
    發(fā)掘<b class='flag-5'>函數(shù)</b>級單指令多數(shù)據(jù)<b class='flag-5'>向量</b>化的方法

    基于申威26010處理器的擴展函數(shù)庫實現(xiàn)與優(yōu)化

    Intel.AMD和IBM都具有針對自身特點的向量擴展庫。相比于傳統(tǒng)的標量計算,向量化技術(shù)帶來的加速比較高。為此,針對申威26010處理器開發(fā)向量數(shù)學(xué)庫軟件。
    發(fā)表于 03-01 15:41 ?2次下載
    基于申威26010處理器的擴展<b class='flag-5'>函數(shù)</b>庫實現(xiàn)與優(yōu)化

    簡單的數(shù)學(xué)運算計算數(shù)學(xué)函數(shù)的方法CORDIC的詳細資料概述

    CORDIC是一個稱為二進制搜索的循環(huán)中使用更簡單的數(shù)學(xué)運算來計算數(shù)學(xué)函數(shù)的方法。最常用的CORDIC用于計算AtAN2(角度)和點的斜邊(距離)。CORDIC還可以用來計算其他
    發(fā)表于 05-31 11:18 ?12次下載
    簡單的<b class='flag-5'>數(shù)學(xué)運算計算數(shù)學(xué)</b><b class='flag-5'>函數(shù)</b>的方法CORDIC的詳細資料概述

    如何理解ARM異常、中斷和向量

    以前,我一直很疑惑這個“ ARM異常 、 中斷以 及他們的 向量表 ”是怎么回事,他們到底是怎么實現(xiàn)的,沒有想到今天偶然看到(ARM System Developers Guide
    發(fā)表于 06-14 10:34 ?4251次閱讀
    如何理解<b class='flag-5'>ARM</b>異常、中斷和<b class='flag-5'>向量</b>表

    使用英特爾數(shù)學(xué)核心函數(shù)庫優(yōu)化三重嵌套循環(huán)矩陣乘法

    我們使用英特爾?數(shù)學(xué)核心函數(shù)庫(MKL)Linux *優(yōu)化了三重嵌套循環(huán)矩陣乘法的版本。
    的頭像 發(fā)表于 11-07 06:04 ?3567次閱讀

    支持向量機(核函數(shù)的定義)

    根據(jù)機器學(xué)習(xí)相關(guān)介紹(10)——支持向量機(低維到高維的映射),支持向量機可通過引入φ(x)函數(shù),將低維線性不可分問題轉(zhuǎn)換為高維線性可分問題。
    的頭像 發(fā)表于 05-20 10:41 ?768次閱讀
    支持<b class='flag-5'>向量</b>機(核<b class='flag-5'>函數(shù)</b>的定義)

    計算數(shù)學(xué)中的函數(shù)迭代介紹

    函數(shù)迭代是數(shù)學(xué)中一個非常重要和有趣的主題,它在不同的領(lǐng)域有著不同的應(yīng)用和著眼點。動力系統(tǒng)中,函數(shù)迭代可以揭示復(fù)雜系統(tǒng)的演化規(guī)律和混沌現(xiàn)象;
    的頭像 發(fā)表于 08-30 10:11 ?1256次閱讀
    計算<b class='flag-5'>數(shù)學(xué)</b>中的<b class='flag-5'>函數(shù)</b>迭代介紹