简单数组处理循环的 AVX 512 与 AVX2 性能对比

2023-12-11

我目前正在研究一些优化并比较 DSP 应用程序的矢量化可能性,这对于 AVX512 来说似乎是理想的选择,因为这些只是简单的不相关数组处理循环。但在新的 i9 上,与 AVX2 相比,使用 AVX512 时我没有测量到任何合理的改进。有什么指点吗?有什么好的结果吗? (顺便说一句。我尝试了MSVC/CLANG/ICL,没有明显的区别,很多时候AVX512代码实际上看起来更慢)


这看起来太宽泛了,但实际上有一些微架构细节值得一提。

请注意,AVX512-VL(矢量长度)允许您使用新的 AVX512 指令(如打包uint64_tdouble128 和 256 位向量上的转换、掩码寄存器等)。现代编译器在针对 Skylake-AVX512(又名 Skylake-X)进行调整时通常会使用 256 位向量进行自动向量化。例如gcc -march=native or gcc -march=skylake-avx512,除非您覆盖调整选项以将首选向量宽度设置为 512,以便进行权衡的代码。请参阅@zam 的回答。


512 位向量的一些主要内容(不是 256 位的 AVX512 指令,例如vpxord ymm30, ymm29, ymm10)在 Skylake-X 上是:

  • 将数据与向量宽度对齐比 AVX2 更重要(每个未对齐的负载都会跨越缓存行边界,而不是在数组上循环时每隔一个)。在实践中,它会产生更大的差异。我完全忘记了我不久前测试过的具体结果,但可能有 20% 的速度减慢,而错位导致的速度减慢不到 5%。

  • 运行 512 位微指令会关闭端口 1 上的矢量 ALU。(但不会关闭端口 1 上的整数执行单元)。某些 Skylake-X CPU(例如 Xeon Bronze)每个时钟只有 1 个 512 位 FMA 吞吐量,但 i7 / i9 Skylake-X CPU 和更高端的 Xeon 在端口 5 上有一个额外的 512 位 FMA 单元,可为AVX512“模式”。

    因此,请相应地进行计划:从扩展到 AVX512,您不会获得双倍的速度,并且代码中的瓶颈现在可能位于后端。

  • 运行 512 位微指令还会限制最大 Turbo,因此挂钟加速可能低于核心时钟周期加速。 Turbo 缩减有两个级​​别:任何 512 位操作,然后heavy512 位,如持续的 FMA。

  • FP除法执行单元为vsqrtps/pd zmm and vdivps/pd is not全屏宽度;它只有 128 位宽,因此 div/sqrt 与乘法吞吐量的比率大约差了 2 倍。参见浮点除法与浮点乘法。 SKX 吞吐量为vsqrtps xmm/ymm/zmm每 3/6/12 个周期 1 次。double-精度是相同的比率,但吞吐量和延迟更差。

    对于 256 位 YMM 向量,延迟与 XMM 相同(sqrt 为 12 个周期),但对于 512 位 ZMM,延迟高达 20 个周期,并且需要 3 uops。 (https://agner.org/optimize/用于指令表。)

    如果您在除法器上遇到瓶颈并且无法在混合中获得更多其他指令,VRSQRT14PS即使您需要牛顿迭代才能获得足够的精度,也值得考虑。但请注意 AVX512 的近似值1/sqrt(x)确实比 AVX/SSE 有更多的保证精度位。)


就自动向量化而言,如果需要任何洗牌,编译器可能会在使用更宽的向量时做得更差。对于简单的纯垂直内容,编译器可以使用 AVX512。

你之前的问题有一个sin函数,也许如果编译器/SIMD 数学库只有 256 位版本,它就不会使用 AVX512 自动矢量化。

如果 AVX512 没有帮助,可能您遇到了内存带宽瓶颈。使用性能计数器进行分析并找出答案。或者尝试多次重复较小的缓冲区大小,看看当缓存中的数据很热时,速度是否会显着提高。如果是这样,请尝试缓存阻止您的代码,或者通过对数据进行一次更多操作来增加计算强度。

AVX512 在 i9 上实现了理论最大 FMA 吞吐量的两倍(以及整数乘法,以及在同一执行单元上运行的许多其他功能),使 DRAM 和执行单元之间的不匹配增加了一倍。因此,更好地利用 L2 / L1d 缓存可以获得两倍的收益。

在数据已经加载到寄存器中时处理数据是很好的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单数组处理循环的 AVX 512 与 AVX2 性能对比 的相关文章

  • 调用/返回/jmp等后x86代码执行?

    我希望这个问题不会太愚蠢 因为它看起来似乎很明显 当我对缓冲区溢出进行一些研究时 我偶然发现了一个简单的问题 调用 返回 跳转后转到新指令地址后 CPU是否会执行该地址处的OP代码 然后将一个字节移动到下一个地址并执行下一个OP代码 依此类
  • 真实文件对象比 StringIO 和 cStringIO 慢?

    StringIO其代码中有以下注释 Notes Using a real file is often faster but less convenient There s also a much faster implementation
  • MS-DOS - 是否可以对 24 位图形进行编程?

    是否可以在 DOS 机器上以 24 位颜色深度进行编程 我知道 VGA 支持 8 位色深 但是有没有办法弄出 24 位色深 谷歌的研究没有发现任何结果 我正在 FreeDOS 而不是 MS DOS 上编程 如果这会影响答案的话 对的 这是可
  • int 13h 42h 不会在 Bochs 中加载任何内容

    我将引导加载程序从 CHS 更改为 LBA 因此我更换了int 13h 02h with int 13h 42h 它在 QEMU 中工作正常 但是 我在 Bochs 和我的笔记本电脑上运行它时遇到问题 我将引导加载程序写入 USB 闪存驱动
  • 加快 pandas groupby 中的滚动总和计算

    我想按组计算大量组的滚动总和 但我很难快速地完成它 Pandas 内置了滚动和展开计算器的方法 这是一个例子 import pandas as pd import numpy as np obs per g 20 g 10000 obs g
  • 我应该在 VS Code 中为“json.maxItemsCompulated”设置什么?

    默认状态为 5000 个符号 这取决于机器的性能还是其他什么 从 VS Code 设置 JSON 计算的最大项目数 计算的轮廓符号和折叠区域的最大数量 由于性能原因而受到限制 这与编辑器中的 GUI 按钮相关 您可以使用它来折叠 JSON
  • 性能 - String.charAt(0) 与 /^.{1}/

    从概念上讲哪个应该更快 String charAt 0 or 1 regex String charAt 0 必须处理和应用正则表达式 速度测试资源 Paul S https stackoverflow com users 1615483
  • 在 Java 中,对复杂模型使用接口是否会带来性能提升?

    标题很难理解 但我不知道如何以另一种方式总结 欢迎任何澄清的编辑 我被告知并建议使用接口来提高性能 即使在并不特别需要常规 接口 角色的情况下也是如此 在这种情况下 对象是大模型 MVC 意义上的 具有许多方法和字段 向我推荐的 好用处 是
  • SQL 中的 JOIN 成本有多高?和/或,性能和标准化之间的权衡是什么?

    我发现了一个类似的线程 但它并没有真正抓住我想要问的本质 所以我创建了一个新线程 我知道规范化和性能之间存在权衡 我想知道划定这条线的最佳实践是什么 在我的特定情况下 我有一个消息传递系统 它具有三个不同的表 messages thread
  • 为什么 pow(int, int) 这么慢?

    我一直在做一些项目欧拉练习来提高我的 C 知识 我写了以下函数 int a 0 b 0 c 0 for a 1 a lt SUMTOTAL a for b a 1 b lt SUMTOTAL a b c SUMTOTAL a b if c
  • 与 SSE 比较 16 字节字符串

    我有 16 字节的 字符串 它们可能更短 但您可能会假设它们在末尾用零填充 但您可能不会假设它们是 16 字节对齐的 至少不总是 如何编写一个例程将它们与 SSE 内在函数进行比较 是否相等 我发现这个代码片段可能会有帮助 但我不确定它是否
  • 慢 Eclipse Spring STS 插件

    我是 Spring 新手 安装了 Eclipse STS 插件 使用服务似乎非常慢 CPU 使用率激增 笔记本电脑只会变热 实际上风扇就像喷气发动机一样运行 直接响应服务的启动 停止 虽然下面的内容确实为我解决了 Spring STS 的所
  • 我们可以使用什么方法来重塑非常大的数据集?

    当由于非常大的数据计算将花费很长时间并且因此我们不希望它们崩溃时 事先知道要使用哪种重塑方法是很有价值的 Lately methods for reshaping data have been further developed regar
  • 非阻塞方法中的饥饿

    一段时间以来 我一直在阅读有关非阻塞方法的内容 这是一段所谓的无锁计数器的代码 public class CasCounter private SimulatedCAS value public int getValue return va
  • IEnumerable 作为 DataTable 性能问题

    我有以下扩展 它生成一个DataTable从一个IEnumerable public static DataTable AsDataTable
  • 嵌套辅助函数和性能

    嵌套辅助函数对于使代码更易于理解非常有用 谷歌甚至建议在他们的应用程序中使用嵌套函数时尚指南 https google styleguide googlecode com svn trunk javascriptguide xml Nest
  • Java ByteBuffer 性能问题

    在处理多个千兆字节文件时 我注意到一些奇怪的事情 似乎使用文件通道从文件读取到使用 allocateDirect 分配的重用 ByteBuffer 对象比从 MappedByteBuffer 读取要慢得多 事实上它甚至比读取到字节还要慢使用
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的

随机推荐

  • 有没有 ios-ntp 的替代方案来获取原子/当前时间 ios?

    在我的应用程序中 我想获得准确的日期和时间 基本上 在我的应用程序中 会有一个时间敏感部分 用户只有在特定时间之后才能启动 但是 如果我从设备中获取日期和时间 用户可以轻松更改设备上的日期和时间 Settings gt General gt
  • 在 jar 中加载文件

    我需要将配置文件打包到 jar 中 配置文件位于 jar 文件的根目录下 但是我收到以下错误 引起原因 java lang IllegalArgumentException URI 不是分层的 在 java io File 来源未知 Fil
  • python:将 1/0 列表转换为布尔值列表

    尝试将 1 0 列表转换为布尔值列表 bool 1 0 1 0 似乎不起作用 1 0 1 0 1不起作用 还有另一种方法 希望是非列表理解 吗 在Python 2中 bool list map bool int list 在Python 3
  • 从 XPath 表达式填充 XML 模板文件?

    从 XPath 表达式的映射填充 或生成 XML 模板文件的最佳方法是什么 要求是我们需要从模板开始 因为这可能包含 XPath 表达式中未捕获的信息 例如 起始模板可能是
  • 在c中不使用线程和sleep()方法定期调用函数

    我想调用一个函数 假设每 10 或 20 秒调用一次 当我搜索时 我想出了一些线索sleep 方法无处不在 我还检查了 C 中的时间和时钟类 但找不到任何对我的问题有帮助的内容 定期调用函数的最简单方法是什么 Use libevent在我看
  • 来自 Windows 窗体应用程序的 HTTP Post C#

    我需要用 C 编写一个表单应用程序 通过 HTTP POST 将参数发送到 url 并返回响应 我真的不知道从哪里开始 这可能吗 预先感谢 加尔 首先请参阅 1 HttpWebRequest类 2 HttpWebResponse类 3 We
  • 如何使谷歌表格公式只计算一次?

    我的 Google 表格中有 3 行 即股票 价格和总计 所以 我只是对股票和价格使用 多个 公式 然后将值放入总行中 但我不希望每当我更改库存值时总行都会更新或更改值 有人能帮我吗 假设您希望单元格 A1 只计算一次其值 您可以将以下内容
  • 在 ASP.NET MVC 中跟踪 LINQ TO SQL 生成的查询

    关于 LINQ to SQL 生成的查询输出的快速问题 我正在使用 ASP NET MVC 项目 Visual Studio 2008 并且正在尝试 MSDN 文档中的建议 MyDataContext dc new MyDataContex
  • MOQ- 使用 Func 参数设置和验证通用方法

    我有一个第三方接口 我想模拟它的方法 为了明确我的目的 请考虑以下 IFoo 接口 它具有像 M2 这样的通用方法 M2 参数之一的类型为 Func public interface IFoo bool M1
  • 从 HandlerInterceptor 抛出 HTTP 状态代码异常

    我正在尝试创建一个 HandlerInterceptor 其预处理的代码结构如下 public boolean preHandle HttpServletRequest req HttpServletResponse res Object
  • 如何删除基于另一个 DataFrame 的列上的 DataFrame 中的行?

    我正在尝试使用SQLContext subtract 在 Spark 1 6 1 中 根据另一个数据帧中的列从数据帧中删除行 让我们举个例子 from pyspark sql import Row df1 sqlContext create
  • FAB 的片段布局与 CoordinatorLayout 冲突

    我在用着材料抽屉 with a MainDrawerActivity我替换里面的每个片段容器 FrameLayout基于所选项目 但我想添加一个与以下项交互的 FAB 仅针对此片段 CoordinatorLayout所以它可以处理很酷的动画
  • 将小数转换为分数

    我正在尝试将十进制数转换为其分数 小数点后最多有 4 位数字 示例 12 34 1234 100 12 3456 123456 10000 我的代码 include
  • 弃用 FBML

    您可能已经知道 或阅读本文末尾的引用 Facebook 正在弃用 FBML 转而使用 iframe 来开发应用程序 我目前正在启动一个新的浏览器插件 需要在我的 Facebook 页面上有一个登陆选项卡 其中包含个性化安装按钮以及人们希望在
  • 为什么我不能使用两个 i32 参数调用 gen_range?

    我有这段代码 但它无法编译 use rand Rng use std io fn main println Guess the number let secret number rand thread rng gen range 0 101
  • 在 Ajax 中处理非常大的长数字的最佳方法?

    Javascript 将所有数字表示为双精度浮点数 这意味着在处理 64 位 Java Long 数据类型最高端的数字 17 位数字之后的任何数字 时 它会失去精度 例如 数字 714341252076979033 变为 714341252
  • For 循环迭代字符串切片不起作用

    我编写了这段代码 它将小写英语短语翻译成猪拉丁语 package main import fmt strings bufio github com stretchr stew slice regexp os func main lst st
  • Qt:当主窗口被模式 QDialog 阻塞时,如何将焦点集中到从主窗口创建的无模式 QDialog

    在我的 Qt 应用程序中 我面临以下场景 当引发特定事件时 我会显示无模式QDialog要求用户确认 对话框显示使用show 函数从一个QMainWindow 任何时候引发事件并且没有其他模式QDialog显示后 用户可以单击确认按钮 不幸
  • 后台信标监控的响应能力(Android Beacon Library / Kontakt SDK / Estimote SDK)

    背景 我正在开发一个 Android 应用程序 用于监视后台的特定信标 并在检测到进入时执行自定义编码 我目前正在使用 Android Beacon Library 进行探索 并且能够在屏幕打开时 几秒钟内 的大部分时间响应地检测到信标 但
  • 简单数组处理循环的 AVX 512 与 AVX2 性能对比

    Closed 这个问题需要调试细节 目前不接受答案 我目前正在研究一些优化并比较 DSP 应用程序的矢量化可能性 这对于 AVX512 来说似乎是理想的选择 因为这些只是简单的不相关数组处理循环 但在新的 i9 上 与 AVX2 相比 使用