https://zhuanlan.zhihu.com/p/677124882

写这篇文章的原因是有个项目需要降低延迟,希望能更快地把512bit的数据从内存搬进PCIe设备。原先的做法是软件写寄存器通知硬件,然后硬件通过PCIe读内存里的512bit。为了降低这个过程的延迟,我们试图改为:软件直接把512bit写入硬件寄存器。这个是FPGA的优势,可以灵活更改硬件逻辑。

因为刚刚好是512bit的长度,我们自然地想到了英特尔的AVX512指令集。通过_mm512_store_si512()的汇编intrinsic,即可通过一个汇编指令,向“内存”写入512bit。测试表明这个操作可以节省大约0.3μs的时间。Intel Intrinsics Guide

_mm512_store_si512()

这里的内存是带引号的,因为实际写入的并不是内存,而是PCIe的寄存器。PCIe寄存器被映射到了虚拟内存空间,这个映射关系可以用cat /proc/ioremap命令查看。在汇编层面,CPU可以像写入内存一样写入PCIe寄存器,让我感到神奇。

也可以注意到,虽然写入512bit只要一个汇编指令,但是这个vmovdqa32 m512, zmm指令的latency是和架构有关的。Skylake架构需要5个周期,而新的架构只要1个周期。这一点在接下来的ARM架构上有更详细的讨(博)论(客)。

从AVX到NEON

出于项目需要,要把这段逻辑移植到ARM上。使用的CPU是ARMv8a指令集,支持NEON指令。

ChatGPT告诉我,上述x86 intrinsic对应的ARM intrinsic是vst1q_u32()。vst1q指的是"vector st1 quad word",在ARMv7上对应的汇编指令是vst1,在ARMv8上是st1。u32指的是无符号32位int。这个intrinsic一次操作4个32位int,也就是128bit,不太满意。于是翻ARM手册,发现了vst1q_u32_x4(),对应的汇编指令是ST1 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T>, <Vt4>.<T> }, [<Xn|SP>], <imm> ,参见Arm A64 Instruction Set Architecture

测试表明这个操作与x86类似,可以节省大约0.3μs的时间。然而ARM测试平台的主频是x86平台的一半,延迟降低的程度不及预期。

CPU写入512bit要多久?

由于使用了FPGA,所以可以通过ILA抓线,看到数据是何时写入FPGA寄存器的。抓线的结果是,x86平台是一次写入512bit,而ARM平台则是分4次,每次写入128bit,因此需要更多的时间(排除CPU频率的影响)。

也就是说,单个ST1 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T>, <Vt4>.<T> }, [<Xn|SP>], <imm> 指令,实际上分了4次写入数据,每次写一个寄存器。然而网上没找到关于这个现象的解释。测试平台的架构是Cortex A72,后来在读A72文档时(Cortex-A72 Software Optimization Guide),发现了这个说明。

再后来读到了这篇【转】国产飞腾D2000:基于A72? - 知乎 (zhihu.com),似乎是国外的CPU爱好者写的分析,

Neoverse N1 还具有两个 FP/矢量执行管道,但具有全宽执行单元。在大多数情况下,N1 每个周期能够完成两个 128 位指令,而 FTC663 只能执行一个。

这个差别似乎涉及到了CPU的执行单元,A72的执行单元每周期只能完成1个128bit指令,而A76架构可以完成2个。

总结

AVX和NEON作为SIMD指令集,一般是用来计算的,经过实测,发现也可以用来加速写入PCIe寄存器。具体的加速效果还与CPU架构有关,单个汇编指令可能需要多个周期才能完成。

多读官方文档,而且要学会寻找自己需要的文档。

[转帖]CPU写入512bit要多久:从AVX到NEON的更多相关文章

  1. [转帖]CPU Cache 机制以及 Cache miss

    CPU Cache 机制以及 Cache miss https://www.cnblogs.com/jokerjason/p/10711022.html CPU体系结构之cache小结 1.What ...

  2. What Your Computer Does While You Wait.CPU的等待有多久?

    原文标题:What Your Computer Does While You Wait 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高 ...

  3. [转帖]CPU 的缓存

    缓存这个词想必大家都听过,其实缓存的意义很广泛:电脑整机最大的缓存可以体现为内存条.显卡上的显存就是显卡芯片所需要用到的缓存.硬盘上也有相对应的缓存.CPU有着最快的缓存(L1.L2.L3缓存等),缓 ...

  4. [转帖]CPU时间片

    CPU时间片 https://www.cnblogs.com/xingzc/p/6077214.html CPU的时间片 CPU的利用率好CPU的 load average 是不一样的 Conntex ...

  5. CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  6. 转:CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  7. CPU与内存(经典问答)

    原文:http://www.cnblogs.com/xkfz007/archive/2012/10/08/2715163.html 下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如 ...

  8. 【转】CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  9. cpu 乱序执行与问题【转】

    转自:https://blog.csdn.net/lizhihaoweiwei/article/details/50562732 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议 ...

  10. 操作系统 | 结合 CPU 理解一行 Java 代码是怎么执行的

    根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. 我们先来分析 CPU 的工作原理,现代 CPU 芯片中大都集成了,控制单元,运算单 ...

随机推荐

  1. 『UniApp』uni-app-打包成App

    前言 大家好,我是 BNTang, 在上一节文章中,我给大家详细的介绍了如何将我开发好的项目打包为微信小程序并且发布到微信小程序商店 趁热打铁,在来一篇文章,给大家详细的介绍如何将项目打包成APP. ...

  2. 【推荐】Helix 常用命令与设置

    目录 Helix常用命令 配置 编辑器 [editor]字段 [editor.statusline] 字段 [editor.lsp] 字段 [editor.cursor-shape] 字段 [edit ...

  3. Feign源码解析5:loadbalancer

    背景 经过前面几篇的理解,我们大致梳理清楚了FeignClient的创建.Feign调用的大体流程,本篇会深入Feign调用中涉及的另一个重要组件:loadbalancer,了解loadbalance ...

  4. 基于Llama2模型的开源模型

      2023年7月18日Meta开源了Llama2,在2万亿个Token上训练,可用于商业和研究,包括从7B到70B模型权重.预训练和微调的代码.相比Llama1,Llama2有较多提升,评估结果如下 ...

  5. 你的JoinHint为什么不生效

    本文分享自华为云社区<你的JoinHint为什么不生效[绽放吧!GaussDB(DWS)云原生数仓]>,作者:你是猴子请来的救兵吗 . 引言 提起数据库的Hint,几乎每个DBA都知道这一 ...

  6. KubeCon China 2023 | 拥抱开源,华为云原生华彩绽放

    本文分享自华为云社区<KubeCon China 2023 | 拥抱开源,华为云原生华彩绽放>,作者: 云容器大未来 . 2023 年度云原生全球旗舰盛会 KubeCon + CloudN ...

  7. 华为云 UCS (On-Premises):运行在您本地数据中心的CCE集群

    摘要:华为云分布式云原生UCS服务,是面向分布式云场景下的新一代云原生产品,提供UCS (Huawei Cloud).UCS (Partner Cloud).UCS (Multi-Cloud).UCS ...

  8. 云小课|细数那些VMware虚拟机的恢复招式

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:当遭遇误操作.病毒 ...

  9. 5种Python使用定时调度任务的方式

    摘要:Python 有几种方法可以定时调度一个任务,这就是我们将在本文中学习的内容. 本文分享自华为云社区<Python中使用定时调度任务(Schedule Jobs)的5种方式)>,作者 ...

  10. Problem B - Card Constructions (构造)

    题意: 你可以用图示的方法建造金字塔,但是每一次都要建最大的金字塔,问最后能建几个金字塔. 思路: 我们可以发现对于每一个金字塔都是两边增加了两天边,然后中间行数− 1 -1−1个三角形,所以就可以求 ...