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. Mysql索引失效的几种原因-mysql-suo-yin-shi-xiao-de-ji-zhong-yuan-yin

    title: Mysql索引失效的几种原因 date: 2021-07-15 17:13:59.019 updated: 2021-12-26 17:43:12.489 url: https://ww ...

  2. 如何清理Docker不用的Volume

    有一句老话叫:书到用时方恨少. 其实电脑的内存空间也是非常宝贵,特别是MacOS下的docker可以分配的空间更是寸土寸金. 在21年的时候我也遇到过类似的问题,当时的经历记录在这篇博客:https: ...

  3. 5.elasticsearch中查询条件

    目录 一.URI查询 指定字段.泛查询 分组和phrase Bool条件 must条件 范围查询 通配符查询 正则表达式 模糊匹配与近似查询 二.RequestBody&DSL ignore_ ...

  4. DNS解析中CNAME和MX记录冲突

    转载:DNS中CNAME和MX记录的冲突 在DNS解析中,CNAME记录与其他记录往往是互斥的.最常见的是CNAME记录和MX记录的互斥.例如我们在http://example.com部署官网,通过C ...

  5. Linux集群存储配置

    RH436_EX集群 介绍Linux环境下集群架构,Linux开源集群软件的安装及配置使用,软件与软件之间的组合.实现高可用集群,负载均衡集群;负载均衡.高可用集群与存储集群间的多集群混合架构使用. ...

  6. CUDA C编程权威指南:1.1-CUDA基础知识点梳理

      主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的. 1.CUDA 解析:2007年,NV ...

  7. HTTP请求转发那些事:你可能不知道的Hop-by-hop Headers和End-to-end Headers

    摘要:不是所有的web容器都能帮助开发者屏蔽hop-by-hop headers,有些容器反而允许开发者自定义hop-by-hop headers来实现更大程度的灵活性. 本文分享自华为云社区< ...

  8. 字节跳动基于DataLeap的DataOps实践

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 本文根据 ArchSummit 全球架构师峰会(深圳站)来自抖音数据研发负责人王洋的现场分享实录整理而成(有删减) ...

  9. Python 太难懂?火山引擎数智平台这款产品可以了解一下!

      更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 「自学 Python?一般人我还是劝你算了吧!」 在国内知识分享平台「知乎」上,这一吐槽话题获得了超过 260 ...

  10. 对话 BitSail Contributor | 吴畅:从好奇,到深入

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 2022 年 10 月,字节跳动 BitSail 数据引擎正式开源.同期,社区推出 Contributor 激励计 ...