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. TypeScript开篇

    1.什么是TypeScript(TS)? Typescript 为 JS 带来了类型能力,如今已被越来越多的大型前端项目选用.Typescript 的出现大大改善了开发体验,增强了代码的可维护性和稳定 ...

  2. [简单] 基于注解玩转excel导出导入

    基于注解玩转excel导出导入 demo 请 加入 598347590 技术解决群获取 个人博客 https://yangbuyi.top 话不多说 开始 <!-- poi office --& ...

  3. quill富文本编辑器quill粘贴图片上传服务器

    强大的富文本编辑器:quill github:32k start++,:https://github.com/quilljs/quill quill粘贴图片上传服务器 <link href=&q ...

  4. JavaFX打包exe+Wind+Mac+Linux多平台分发等等

    JavaFX打包exe+Wind+Mac+Linux多平台分发等等 由于此教程相对复杂,适合对java有一定掌握的同学操作,于是我又写了一篇用idea简单打包exe的教程,文章地址:https://b ...

  5. Baby_Step_Gaint_Step(BSGS) 算法

    \(BSGS\) 算法,又称 "北(\(B\))上(\(S\))广(\(G\))深(\(S\))" 算法,"拔山盖世"算法,可以在 \(O(\sqrt{n})\ ...

  6. ubuntu 之 lftp 上传 和下载

    1. 安装 sudo apt-get install lftp 2. 简单教程 2.0 声明:上传或下载文件 用get 或 mget,这种方式 不包含文件夹本身,如果需要连文件夹一起上传或下载则需要使 ...

  7. 使用IO流写一个随机点名程序

    前言 最近学习了关于IO流的一些知识点,但是应用还不够,所以今天做个简单案例: 随机创建名字导入文件中: package ioandcollection; import java.io.Buffere ...

  8. hutool的常用方法

    https://www.hutool.cn/docs/#/ 官方文档 Hutool 是一个 Java 开发工具包,提供了丰富实用的工具类,包括字符串处理.日期处理.文件操作.加密解密.网络请求等等.以 ...

  9. 什么是全场景AI计算框架MindSpore?

    摘要:MindSpore是华为公司推出的新一代深度学习框架,是源于全产业的最佳实践,最佳匹配昇腾处理器算力,支持终端.边缘.云全场景灵活部署,开创全新的AI编程范式,降低AI开发门槛. MindSpo ...

  10. ImproperlyConfigured('SQLite 3.8.3 or later is required Centos升级SQLite

    遇到这个错误可以选择给django降级,不建议 这里选择升级SQLite 1.查看版本 sqlite3 --version 2.Centos7安装最新的sqlite3 wget https://www ...