0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Arm上使用向量数学函数

jf_9aVl32Dp 来源:Arm软件开发者 作者:Arm软件开发者 2023-05-28 09:21 次阅读

作者:Chris Goodyer 2023年5月16日

广泛工作负载(包括许多基准测试,如SPEC)的性能依赖于基本数学例程的有效实现。这些例程可以通过矢量化和有效使用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上天气预测模型的性能。

Arm优化的标量和向量数学例程实现在Arm软件/优化例程中作为开源软件公开提供(https://github.com/ARM-software/optimized-routines)。这些实现被方便地授权,允许用户在需要时直接将它们包含在其他项目中。此外,我们还将这些作为预编译二进制文件发布,称为Libamath,作为Arm PL和ACfL的一部分。

虽然ACfL能够通过自动矢量化生成对矢量数学例程的调用(请参见https://developer.arm.com/documentation/101458/latest/有关使用“-fsimdmath”编译器选项的更多详细信息,其他编译器可能还不允许在AArch64上发生这种情况。然而,将项目链接到Arm PL或在禁用自动矢量化的情况下使用ACfL构建它仍然可以访问矢量数学符号。Libamath随ACfL提供,但作为单独的库,因此可以通过添加-lamath将项目链接到Libamath。

在这篇文章中,我们强调了性能可能增加的规模,详细说明了精度要求,并详细解释了如何在自己的代码中直接使用这些函数。

准确性和性能

Libamath例程的最大错误低于4个ULP,并且仅支持默认的舍入模式(舍入到最近,绑定到偶数)。因此,与这些函数的其他矢量化实现类似,从libm切换到libamath会导致一系列例程的少量精度损失。

Neoverse V1系统的预期性能增益如以下2个单精度和双精度例程图所示。

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

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

命名和调用约定

Libamath标量例程的名称与libm中使用的名称相匹配,例如,单精度和双精度指数分别称为expf和exp。

每个向量例程都在向量ABI名称下公开。AArch64的向量函数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节)。

例如,标量、Neon和SVE单精度指数的符号分别读作expf、_ZGVnN4v_expf和_ZGVsMxv_expf。

向量ABI 在向量ABI中,向量函数名被篡改为以下各项的串联:

'_ZGV' '_'

其中

• :标量libm函数的名称 • :Neon为“n”,SVE为“s”

• :“M”表示屏蔽/谓词版本,“N”表示无屏蔽。仅为SVE定义屏蔽例程,仅为Neon定义无屏蔽例程。

• :表示以车道数表示的矢量长度的整数。对于Neon,双精度中=‘2’,单精度中=‘4’。对于SVE,=‘x’。

• :对于1个输入浮点或整数参数,“v”用于签名,“vv”用于2个。有关更多详细信息,请参见AArch64的向量函数ABI(https://github.com/ARM-software/abi-aa/blob/2982a9f3b512a5bfdc9e3fea5d3b298f9165c36b/vfabia64/vfabia64.rst#451name-mangling-function)。

示例

最新版本23.04开始,Arm Performance Libraries提供了文档和示例程序,以展示用户如何直接从其程序中调用矢量例程,而不依赖于自动矢量化。以下代码片段说明了如何调用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
}

结论

使用Arm Compiler for Linux时,libamath通过依赖于编译器的自动矢量化,为这些应用程序提供了利用性能的潜力。这提供了所有math.h例程的Arm优化Neon和SVE变体。我们的“优化例程”(https://github.com/ARM-software/optimized-routines)开源代码库提供了对更广泛使用的例程的最新优化的访问权限。这些矢量化算法已经用于加速计算物理、机器学习网络等各种应用程序中的基本数学运算。当使用这两种方法之一时,用户还可以使用上面描述的接口直接从其代码中调用这些矢量例程。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9045

    浏览量

    366800
  • SPEC
    +关注

    关注

    0

    文章

    31

    浏览量

    15783
  • 数学函数
    +关注

    关注

    0

    文章

    9

    浏览量

    6331

原文标题:在Arm上使用向量数学函数

文章出处:【微信号:Arm软件开发者,微信公众号:Arm软件开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MATLAB常用的基本数学函数

    matlab! MATLAB常用的基本数学函数 abs(x):纯量的绝对值或向量的长度angle(z):复数z的相角(Phase angle)sqrt(x):开平方real(z):复数z的实部
    发表于 03-11 23:34

    XC32函数向量x到大

    用它时,链接器就抱怨VEC。Tor函数是大的。我缺少什么?向量间距由启动代码设置为8,MVEC启用。我使用下面的ISR C代码:下面的程序集:这是链接器的输出:XC32-L.E.EX:异常
    发表于 10-26 16:09

    学习DSP库的基本数学函数

    第11章 DSP基础函数-绝对值,求和,乘法和点乘本期教程开始学习ARM官方的DSP库,这里我们先从基本数学函数开始。本期教程主要讲绝对值,加法,点乘和乘法四种运算。目录第11章 DS
    发表于 08-17 07:13

    基于支持向量机的预测函数控制

    基于支持向量机的预测函数控制 Predictive Functional Control Based on Support Vector Machine
    发表于 03-17 09:24 21次下载

    基于先验知识的支持向量图像分割中的应用

    文中研究现有先验知识与支持向量机融合的基础,针对置信度函数凭经验给出的不足,提出了一种确定置信度函数方法,更好地进行分类。该方法是建立
    发表于 07-16 17:02 39次下载

    双目标函数支持向量情感分析中的应用

    双目标函数支持向量情感分析中的应用_刘春雨
    发表于 01-03 17:41 0次下载

    组合核函数多支持向量机的直线电机建模

    组合核函数多支持向量机的直线电机建模_赵吉文
    发表于 01-07 17:16 1次下载

    大数据中边界向量调节熵函数支持向量机研究

    大数据中边界向量调节熵函数支持向量机研究_林蔚
    发表于 01-07 19:08 0次下载

    发掘函数级单指令多数据向量化的方法

    当前面向单指令多数据( SIMD)扩展部件的两类向量化方法分别是循环级向量化方法和超字级并行(SLP)方法。针对当前编译器不能实现函数向量化的问题,提出一种基于静态单赋值的
    发表于 11-29 16:08 0次下载
    发掘<b class='flag-5'>函数</b>级单指令多数据<b class='flag-5'>向量</b>化的方法

    基于申威26010处理器的扩展函数库实现与优化

    Intel.AMD和IBM都具有针对自身特点的向量扩展库。相比于传统的标量计算,向量化技术带来的加速比较高。为此,针对申威26010处理器开发向量数学库软件。
    发表于 03-01 15:41 2次下载
    基于申威26010处理器的扩展<b class='flag-5'>函数</b>库实现与优化

    简单的数学运算计算数学函数的方法CORDIC的详细资料概述

    CORDIC是一个称为二进制搜索的循环中使用更简单的数学运算来计算数学函数的方法。最常用的CORDIC用于计算AtAN2(角度)和点的斜边(距离)。CORDIC还可以用来计算其他
    发表于 05-31 11:18 12次下载
    简单的<b class='flag-5'>数学运算计算数学</b><b class='flag-5'>函数</b>的方法CORDIC的详细资料概述

    如何理解ARM异常、中断和向量

    以前,我一直很疑惑这个“ ARM异常 、 中断以 及他们的 向量表 ”是怎么回事,他们到底是怎么实现的,没有想到今天偶然看到(ARM System Developers Guide
    发表于 06-14 10:34 4260次阅读
    如何理解<b class='flag-5'>ARM</b>异常、中断和<b class='flag-5'>向量</b>表

    使用英特尔数学核心函数库优化三重嵌套循环矩阵乘法

    我们使用英特尔®数学核心函数库(MKL)Linux *优化了三重嵌套循环矩阵乘法的版本。
    的头像 发表于 11-07 06:04 3574次阅读

    支持向量机(核函数的定义)

    根据机器学习相关介绍(10)——支持向量机(低维到高维的映射),支持向量机可通过引入φ(x)函数,将低维线性不可分问题转换为高维线性可分问题。
    的头像 发表于 05-20 10:41 776次阅读
    支持<b class='flag-5'>向量</b>机(核<b class='flag-5'>函数</b>的定义)

    计算数学中的函数迭代介绍

    函数迭代是数学中一个非常重要和有趣的主题,它在不同的领域有着不同的应用和着眼点。动力系统中,函数迭代可以揭示复杂系统的演化规律和混沌现象;
    的头像 发表于 08-30 10:11 1274次阅读
    计算<b class='flag-5'>数学</b>中的<b class='flag-5'>函数</b>迭代介绍