[转帖]CPU写入512bit要多久:从AVX到NEON
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的更多相关文章
- [转帖]CPU Cache 机制以及 Cache miss
CPU Cache 机制以及 Cache miss https://www.cnblogs.com/jokerjason/p/10711022.html CPU体系结构之cache小结 1.What ...
- What Your Computer Does While You Wait.CPU的等待有多久?
原文标题:What Your Computer Does While You Wait 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高 ...
- [转帖]CPU 的缓存
缓存这个词想必大家都听过,其实缓存的意义很广泛:电脑整机最大的缓存可以体现为内存条.显卡上的显存就是显卡芯片所需要用到的缓存.硬盘上也有相对应的缓存.CPU有着最快的缓存(L1.L2.L3缓存等),缓 ...
- [转帖]CPU时间片
CPU时间片 https://www.cnblogs.com/xingzc/p/6077214.html CPU的时间片 CPU的利用率好CPU的 load average 是不一样的 Conntex ...
- CPU与内存的那些事
下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...
- 转:CPU与内存的那些事
下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...
- CPU与内存(经典问答)
原文:http://www.cnblogs.com/xkfz007/archive/2012/10/08/2715163.html 下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如 ...
- 【转】CPU与内存的那些事
下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...
- cpu 乱序执行与问题【转】
转自:https://blog.csdn.net/lizhihaoweiwei/article/details/50562732 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议 ...
- 操作系统 | 结合 CPU 理解一行 Java 代码是怎么执行的
根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. 我们先来分析 CPU 的工作原理,现代 CPU 芯片中大都集成了,控制单元,运算单 ...
随机推荐
- AutoGPT实战
1.概述 人工智能(AI)的能力持续在全球范围内引起轰动,并对我们日常生活和职业生涯带来重大变革.随着像ChatGPT这样的先进生成型AI模型以及从GPT-3到GPT-4的加速,我们在高级推理.理解更 ...
- 如何用python脚本制作生成CANdbc
最近在工作中,有同事拿了一个excel的dbc表格,在用官方的dbc工具一个一个创建信号,大概看了一下共累计20多个节点,300多个信号,居然在手动处理,顿感无语.. 于是在网络上搜相关的dbc 通过 ...
- 动态规划问题(三)最长递增子序列长度(LIS)
问题描述 有一个数组,它内部的顺序是乱序的,现在要求你找出该数组中的最长的递增子序列长度. 例如:对于数组 {10, 20, 9, 33, 21, 50, 41, 60, 80},它的最长递增 ...
- 网络地图服务(WMS)详解
目录 1.概述 2.GetCapabilities 3.GetMap 4.GetFeatureInfo 阅读本文之前可参考前文:<地图服务器GeoServer的安装与配置>与<Geo ...
- 地图服务器GeoServer的安装与配置
目录 1.安装配置Java 2.安装配置Tomcat 3.安装配置GeoServer GeoServer提供了多种安装配置方式,但是本质上GeoServer是一个基于Java Web的项目,因此我们理 ...
- 技术实践丨PostgreSQL插件之pg_dirtyread "闪回查询"
摘要:Oracle数据库有时候不小心删除掉数据,想查询这些数据,或者恢复数据,就可以使用带有as of子句的select语句进行闪回查询. PG粉有福了,下面介绍一种类似"闪回查询" ...
- 性能之巅:定位和优化程序CPU、内存、IO瓶颈
摘要:性能优化指在不影响系统运行正确性的前提下,使之运行得更快,完成特定功能所需的时间更短,或拥有更强大的服务能力. #一.思维导图 #二.什么是性能优化? 性能优化指在不影响系统运行正确性的前提下, ...
- 探究Python源码,终于弄懂了字符串驻留技术
摘要:在本文中,我们将深入研究 Python 的内部实现,并了解 Python 如何使用一种名为字符串驻留(String Interning)的技术,实现解释器的高性能. 每种编程语言为了表现出色,并 ...
- 对话 BitSail Contributor | 刘啸:参与开源,提升自我技术力
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 2022 年 10 月,字节跳动 BitSail 数据引擎正式开源.同期,社区推出 Contributor 激励计 ...
- Solon 编译打包怎样保持参数名不变?
1.Java 项目 Java maven 项目 <plugin> <groupId>org.apache.maven.plugins</groupId> <a ...