Skip to content

搞英语 → 看世界

翻译英文优质信息和名人推特

Menu
  • 首页
  • 作者列表
  • 独立博客
  • 专业媒体
  • 名人推特
  • 邮件列表
  • 关于本站
Menu

将 ARM NEON 与 SVE 代码混合以获得乐趣和利润

Posted on 2025-03-29

大多数移动设备使用 64 位 ARM 处理器。越来越多的服务器(亚马逊、微软)也使用 64 位 ARM 处理器。

这些处理器具有称为 ARM NEON 的特殊指令,提供称为单指令多数据 (SIMD) 的并行性。例如,您可以使用一条指令将 16 个值与其他 16 个值进行比较。

一些最新的 ARM 处理器还支持更高级的指令,称为 SVE 或可扩展向量扩展。随着时间的推移,他们添加了越来越多的扩展:SVE 2 和 SVE 2.1。

ARM NEON 的寄存器设置为 128 位,而 SVE 寄存器是 128 位的倍数。实际上,SVE 寄存器通常是 128 位,但也有例外。 Amazon Graviton 3 基于ARM Neoverse V1 内核,支持向量长度为​​ 256 位(32 字节)的 SVE。对于Graviton 4来说,它基于ARM Neoverse V2核心,与NEON一样支持向量长度为​​16字节的SVE2。

因此,如果您是一名底层工程师,您应该选择:要么使用 ARM NEON,要么使用 SVE。作为对我最近写的一篇文章的评论,Ashton Six 观察到您可以混合和匹配这些指令(NEON 和 SVE),因为可以保证 SVE 寄存器的前 128 位是 NEON 寄存器。 Ashton 提供了使用汇编代码的演示。
如果您有最新的 C/C++ 编译器(例如 GCC 14),那么您可以相当轻松地在 NEON 和 SVE 之间来回切换。如果您使用arm_neon_sve_bridge.h头文件,您将提供两个函数:
  • svset_neonq :将 NEON 128 位向量(uint8x16_t、int32x4_t 等)的内容设置为 SVE 可扩展向量(svuint8_t、svint32_t 等)。
  • svget_neonq :提取 SVE 可扩展向量的前 128 位并将它们作为 NEON 128 位向量返回。

这些函数是“免费的”:它们可能不会被编译为任何指令。

让我们用一个例子来说明。在最近的一篇文章中,我讨论了检查 NEON 寄存器中是否有非零字节有点复杂。一个有竞争力的解决方案如下:

 int veq_non_zero_max ( uint8x16_t v ) { 返回vmaxvq_u32 ( vreinterpretq_u32_u8 ( v ) ) ! = 0 ; } 

实际上,我们计算寄存器中的最大 32 位整数,将其视为四个 32 位整数。该函数编译为三个基本指令:umaxv、fmov 和比较 (cmp)。

让我们考虑以下 SVE 替代方案。它将输入转换为 SVE 向量,为所有 16 个位置创建掩码,将每个元素与零进行比较以生成非零位置的谓词,最后测试是否有任何元素非零,如果有则返回 1,如果全部为零则返回 0 — 本质上执行高效的矢量化“任何非零”检查。
 int sve_non_zero_max ( uint8x16_t nvec ) {  svuint8_t 向量;  vec = svset_neonq_u8 ( vec , nvec ) ;  svbool_t 掩码= svwhilelt_b8 ( 0 , 16 ) ;  svbool_t cmp = svcmpne_n_u8 (掩码, vec , 0 ) ; 返回svptest_any (掩码, cmp ) ; }

该函数除了mask的初始化外,由cmpne和cset两条指令组成。在某些 ARM 内核中,这两条指令可能会融合为一条指令。尽管混合 NEON 和 SVE 的代码看起来更复杂,但它应该更高效。

如果您知道您的目标处理器支持 SVE(或 SVE 2 或 SVE 2.1),并且您已经有 ARM NEON 代码,则可以尝试向其中添加 SVE 位。

原文: https://lemire.me/blog/2025/03/29/mixing-arm-neon-with-sve-code-for-fun-and-profit/

本站文章系自动翻译,站长会周期检查,如果有不当内容,请点此留言,非常感谢。
  • Abhinav
  • Abigail Pain
  • Adam Fortuna
  • Alberto Gallego
  • Alex Wlchan
  • Answer.AI
  • Arne Bahlo
  • Ben Carlson
  • Ben Kuhn
  • Bert Hubert
  • Bits about Money
  • Brian Krebs
  • ByteByteGo
  • Chip Huyen
  • Chips and Cheese
  • Christopher Butler
  • Colin Percival
  • Cool Infographics
  • Dan Sinker
  • David Walsh
  • Dmitry Dolzhenko
  • Dustin Curtis
  • Elad Gil
  • Ellie Huxtable
  • Ethan Marcotte
  • Exponential View
  • FAIL Blog
  • Founder Weekly
  • Geoffrey Huntley
  • Geoffrey Litt
  • Greg Mankiw
  • Henrique Dias
  • Hypercritical
  • IEEE Spectrum
  • Investment Talk
  • Jaz
  • Jeff Geerling
  • Jonas Hietala
  • Josh Comeau
  • Lenny Rachitsky
  • Liz Danzico
  • Lou Plummer
  • Luke Wroblewski
  • Matt Baer
  • Matt Stoller
  • Matthias Endler
  • Mert Bulan
  • Mostly metrics
  • News Letter
  • NextDraft
  • Non_Interactive
  • Not Boring
  • One Useful Thing
  • Phil Eaton
  • Product Market Fit
  • Readwise
  • ReedyBear
  • Robert Heaton
  • Ruben Schade
  • Sage Economics
  • Sam Altman
  • Sam Rose
  • selfh.st
  • Shtetl-Optimized
  • Simon schreibt
  • Slashdot
  • Small Good Things
  • Taylor Troesh
  • Telegram Blog
  • The Macro Compass
  • The Pomp Letter
  • thesephist
  • Thinking Deep & Wide
  • Tim Kellogg
  • Understanding AI
  • 英文媒体
  • 英文推特
  • 英文独立博客
©2025 搞英语 → 看世界 | Design: Newspaperly WordPress Theme