SIMD 对超标量乱序 CPU 有什么好处?

2023-12-14

我一直在阅读最近可用的 AVX-512 说明,我觉得有一个基本概念我不理解。对于已经执行乱序执行的超标量 CPU,SIMD 有什么好处?

考虑以下伪汇编代码。使用 SIMD:

load 16 floats to register simd-a
load 16 floats to register simd-b
multiply register simd-a by simd-b as 16 floats to register c
store the results to memory

没有 SIMD 的情况下:

load a float to register a
load a float to register b
multiply register a and register b as floats to c
store register c to memory

load a float to register a (contiguous to prior load to a)
load a float to register b (contiguous to prior load to b)
multiply register a and register b as floats to c
store register c to memory (contiguous to previous stored result)

[continued for 16 floats]

我已经有一段时间没有完成这样的低级工作了,但在我看来,CPU 可以将非 SIMD 示例转换为按数据顺序运行:

  1. 并行处理 32 个加载指令(如果内存正确对齐,可能只是对缓存/内存的两个请求)
  2. 加载完成后并行执行 16 个乘法指令
  3. 16 次存储到内存,如果正确对齐,这将只是对缓存/内存的单个请求

从本质上讲,感觉 CPU 足够智能,可以在这两种情况下以相同的速度执行。显然,当我们继续向 ISA 添加更多和更广泛的 SIMD 指令时,我在这里遗漏了一些东西,那么这些类型的指令的实用价值从何而来?


区别主要是在硬件上实现这样的设计的可行性。由于各种原因,超标量架构的可扩展性不太好。例如,在一个周期内重命名这么多寄存器是很困难的,因为您重命名的内容可能是相关的(如果它确实是翻译的 SIMD 代码,它们就不会是相关的,但您无法知道这一点)。物理寄存器文件需要大量额外的读写端口,这非常烦人。相比之下,更宽的寄存器很容易。转发网络的规模将呈爆炸式增长。 Alot每个周期都必须将微操作插入到活动窗口中,其中许多微操作必须被唤醒和分派,并且许多微操作必须退出。由于机器现在充斥着更多数量级的微操作,您可能希望支持更大的活动窗口,否则它实际上已经变得更小(对于等效代码,它的效率会降低)。

整个内存业务也变得更加困难,因为现在您必须在一个周期中支持大量访问(所有访问都必须经过单独的翻译,对其应用排序约束,参与转发等等),而不是只是更广泛的访问(这相对容易)。

基本上,这种假设的设计需要很多已经很难通过合理的功率和面积预算有效实施的事情,然后使它们变得更加困难。其中许多事情的复杂性与您想要在一个周期中执行的微指令数量成近似平方关系,而不是线性关系。

添加更宽的 SIMD,他们一直在做的方式,很大程度上只是复制粘贴 SIMD 单元(因此大多数 AVX 和 AVX2 指令的烦人语义)并为某些东西提供更高的位宽。如果你这样做的话,扩展并没有什么不好。

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

SIMD 对超标量乱序 CPU 有什么好处? 的相关文章

  • 使用较新版本时是否可以使用较旧的 SIMD 版本?

    当我可以使用 SSE3 或 AVX 时 旧的 SSE 版本 如 SSE2 或 MMX 是否可用 或者我还需要单独检查它们吗 一般来说 这些都是附加的 但请记住 多年来英特尔和 AMD 对这些的支持之间存在差异 如果您有 AVX 那么您也可以
  • 如何在 MSVC 中启用 SSE4.1 和 SSE3(但不是 AVX)

    我正在尝试使用 MSVC 启用不同的 simd 支持 有一个页面讨论启用一些simd 例如SSE2 AVX AVX2https learn microsoft com en us cpp build reference arch x86 r
  • SSE (SIMD):向量乘标量

    我在程序中执行的常见操作是按标量缩放向量 V s 例如 1 2 3 4 2 2 4 6 8 除了首先在向量中的每个位置加载标量 例如 mm set ps 2 2 2 2 然后相乘之外 是否有 SSE 或 AVX 指令可以执行此操作 这就是我
  • SIMD 和多线程之间的区别[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在并行编程范例中遇到的 SIMD 和多线程概念之间有什么区别 SIMD means 单指令 多数据 https en wikipedi
  • AVX2 有符号 8 位元素的整数乘法,产生有符号 16 位结果?

    我有两个 m256i 向量 填充了 32 个 8 位整数 像这样的东西 int8 a0 new int8 32 2 int8 a1 new int8 32 3 m256i v0 mm256 loadu si256 m256i a0 m256
  • SSE比FPU慢?

    我有一大段代码 其主体部分包含这段代码 result nx m Lx ny m Ly m Lz sqrt nx nx ny ny 1 我将其矢量化如下 一切都已经是float m128 r mm mul ps mm set ps ny nx
  • AVX __m256i 有符号 32 位元素的整数除法

    我试图在 AVX 机器上进行 SIMD 划分并收到编译错误 这是我的代码 m256i help int arr 8 int arr2 8 help mm256 load si256 m256i arr m256i temp temp mm2
  • 使用SIMD解包8位到16位:AVX2版本混淆了顺序

    我正在尝试使用 SSE2 来解压带零的文本 并将其扩展到 AVX2 这就是我的意思 假设您有这样的文本 abcd 我正在尝试使用SSE2来解压abcd into a 0b 0c 0d The 0是零 这当然适用于 16 个字符而不是 4 个
  • 无符号 32 位整数的水平最小值和 SSE 中的位置

    我正在寻找一种方法来查找无符号 32 位整数的最小值及其在 SSE 中的位置 类似于 mm minpos epu16 我知道我可以通过一系列 mm min epu32 和洗牌 移位找到最小值 但这并不能让我找到位置 有人有任何很酷的方法吗
  • SIMD如下代码

    如何用 C 语言对以下代码进行 SIMIDize 当然使用 SIMD 内在函数 我在理解 SIMD 内在函数方面遇到困难 这会有很大帮助 int sum naive int n int a int sum 0 for int i 0 i l
  • vgetmantps 与 andpd 获取浮点数尾数的说明

    对于 skylakex agnerfog 的指令表 Instruction Operands ops fused domain ops unfused domain ops each port Latency Reciprocal thro
  • 有没有一种方法可以根据编译时未知的掩码长度来掩码 __m128i 寄存器的一端?

    我有一个看似简单的问题 将字符串加载到 m128i 寄存器中 使用 mm loadu si128 然后查找字符串的长度 使用 mm cmpistri 现在 假设长度低于 16 我希望在第一个字符串结尾零之后只有零 实现此目的的一种方法是将
  • GCC -msse2 不生成SIMD代码

    我试图找出为什么 g 不生成 SIMD 代码 信息 GCC 操作系统 CPU gcc v gcc version 4 8 2 Ubuntu 4 8 2 19ubuntu1 cat proc cpuinfo model name Intel
  • 如何使用 SIMD 检查偶数/奇数通道是否在给定范围内?

    Given a m128i其中存储 16char是 偶数索引车道指的是even车道 即 0 2 4 14 处的车道 奇数索引车道指的是odd车道 即 1 3 5 15 处的车道 在我的应用程序中 偶数 奇数车道必须在给定范围内 例如 假设e
  • 进行水平 SSE 向量和(或其他简化)的最快方法

    给定一个由三个 或四个 浮点数组成的向量 对它们求和的最快方法是什么 SSE movaps shuffle add movd 总是比 x87 快吗 SSE3 中的水平相加指令值得吗 转移到 FPU 然后是 faddp faddp 的成本是多
  • 我应该使用 SIMD 或向量扩展还是其他什么?

    我目前正在开发一个开源 3D 应用程序框架c questions tagged c 2b 2b with c 11 questions tagged c 2b 2b11 我自己的数学库是这样设计的XNA数学库 http msdn micro
  • 为什么矢量化通常比循环更快?

    为什么在执行操作的硬件的最低级别和所涉及的一般底层操作 即 运行代码时所有编程语言的实际实现通用的事情 矢量化通常比循环快得多 计算机在循环时会做什么而在使用矢量化时不会做什么 我指的是计算机执行的实际计算 而不是程序员编写的计算 或者它有
  • C++ 错误:“_mm_sin_ps”未在此范围内声明

    我正在尝试对将函数应用于数组的不同方法进行基准测试 why is mm sin ps在我的范围内不知道但是 mm sqrt ps is 我怎样才能让它知道 并且编译没有错误 include
  • 跨 AVX 通道的最佳方式是什么?

    有些问题具有类似的标题 但我的问题涉及其他地方未涵盖的一个非常具体的用例 我有 4 个 128d 寄存器 x0 x1 x2 x3 我想将它们的内容重新组合在 5 个 256d 寄存器 y0 y1 y2 y3 y4 中 以准备其他计算 on
  • 使用 AVX/AVX2 转置 8x8 浮点

    转置 8x8 矩阵可以通过制作四个 4x4 矩阵并对每个矩阵进行转置来实现 这不是我想要的 在另一个问题中 一个答案给出了解决方案 https stackoverflow com a 2518670 4144148x8 矩阵只需要 24 条

随机推荐

  • 如何使用 VB.NET 从具有 IDENTITY-H 字体的 PDF 文件中提取文本

    我有一个 PDF 文件 我正在使用 iTextSharp 类以编程方式从 PDF 文件中读取文本 它确实读取 Ansi 编码文本 但不读取 IDENTITY H 编码文本 我的问题是如何使用 VB Net 从 pdf 文件中读取 IDENT
  • php preg_match 和 ereg 语法差异

    我发现语法是preg match 和已弃用的ereg 是不同的 例如 我以为 preg match div div content 意思是一样的 ereg div div content 但是我错了 preg match 不包含特殊字符 如
  • 如何将utf8字符串转换为[]byte?

    我想解组string包含 JSON 但是 那Unmarshal函数需要一个 byte作为输入 如何转换我的 UTF8string to byte 这个问题可能是重复的如何将字符串分配给字节数组 但仍然回答它 因为有更好的替代解决方案 转换自
  • Visual Studio 2015 xsl调试转换失败WebException SocketException

    在 VS 2015 中调试 xslt 时 出现以下错误消息 xsl 转换失败 请参阅输出窗口了解详细信息 WebException 无法连接到远程服务器 SocketException 无法建立连接 因为目标计算机主动拒绝它 127 0 0
  • JSF 列表转换器

    如何为 JSF2 中的 A 类项目列表编写转换器 我已经为 A 类编写了一个转换器 但这些项目使用默认的 toString 函数显示 A hashcode 我需要使用转换器而不是支持 bean 方法 以便可以进行验证 Hibernate V
  • 将按钮的文本输入到文本框中

    继我的上一个问题之后由用户重命名的按钮得到了很快的答复并且有很大帮助 目前我已经得到了这个代码 我需要在 100 个按钮上使用它 我需要知道的是如何使用按钮中的文本将其放入需要它们的不同文本框中 If Label4 Text Admin T
  • 将 R Dataframe 中的 NA 和 "" 单元格设置为 NULL

    我在 R 中有一个数据框 其中某些列中的某些行的值是NA或空字符串 我想将这些转换为NULL价值观 所以我需要数据框中的任何单元格NA or to be NULL 我怎样才能做到这一点 当我尝试时 DF DF Column NA lt NU
  • Websphere Liberty 8.5:设置 Java 类路径

    我正在运行 Websphere Liberty 8 5 我的应用程序从文件系统中读取一些通过 Java CLASSPATH 获取的文件 但我似乎找不到将文件系统中的目录附加到 Liberty 读取的 CLASSPATH 的方法 我尝试过手动
  • 理解 Javascript 中的“this”

    我有两个代码块 一个不起作用 另一个起作用 因为我分配了 that this 并在我的函数中使用了 that 而不是 this 有人可以帮助我理解为什么会这样 如果我说得对的话 如果不对 请启发我 这将有助于了解人们应该如何看待 JavaS
  • 如何在 python/java 中使用 Selenium 访问 Chrome 的 Devtools Network 选项卡请求或摘要的值?

    我正在使用 chrome 选项来使用 selenium 访问性能日志记录 我正在尝试编写一段代码来帮助我计算出 http 请求的总数以及加载完成后页面的大小 我们可以使用开发工具的网络选项卡手动检查这一点 只需要知道如何访问网络表的值或汇总
  • 有没有办法配置 Python 日志记录来记录断言失败的内容或上下文?

    我正在运行测试用例 我想以这样的方式设置我的日志记录 使其自动记录测试失败的所有情况 但我想获得自定义响应 例如 如果断言失败我 我想获得对我的测试发出的请求的响应 而不仅仅是断言失败的默认消息 目前我只知道断言失败了 但不知道程序返回了什
  • Angular2 styleUrls 不加载外部样式

    正在开发 Angular2 应用程序 希望能够为公共内容和管理内容加载不同的样式 然而 Angular 似乎忽略了从外部源加载的样式 Component styleUrls http url to external styles 上面的代码
  • 创建一个包含 R 中出现次数的列[重复]

    这个问题在这里已经有答案了 我正在尝试向现有数据框添加一列 以便该列定义不同的每个用户都购买过的产品 一个玩具示例是 Customer Product 1 Chocolate 1 Candy 1 Soda 2 Chocolate 2 Cho
  • 如何清理和重新编码 R 调查数据中的检查所有适用的响应?

    我有一些调查数据 其中包含一些多重响应问题 如下所示 HS18 为什么在南非看病难 选择所有符合条件的 1 Too expensive 2 No transportation to the hospital clinic 3 Hospita
  • 如何构建采用资源 id 数组的 REST API

    我正在为我的项目构建 REST API 用于获取给定用户的 INFO 的 API 是 api com users USER ID 我还想允许客户端传递用户 ID 列表 如何构建 API 使其成为 RESTful 并接收用户 ID 列表 如果
  • HTML5 是否允许您在浏览器中与本地客户端文件交互

    我看过一些关于通过网页访问客户端计算机上的文件的帖子 即这个question 我正在尝试为我正在编写的某些算法采用 在云中持续更新 范例 以便我的用户只需访问网页即可访问最新版本 这要求程序 网页可以从一个目录开始 递归地检查其中的文件 并
  • ptTimeSelect JQuery TimePicker 插件问题

    我正在尝试使用 jQuery ptTimeSelect 插件http pttimeselect sourceforge net example index html 这是来自 aspx 的代码
  • 如何使用 DirectShow.NET C# 访问音频流

    我想做的是将任意音频文件传递到 DirectShow 过滤器 并最终使用 NET 3 5 C 和 DirectShow NET 接收 PCM 音频 流对象 我想说的是 Stream OpenFile string filename and
  • 条件编译和 Objective-C/Xcode

    因此 我正在开展一个学习项目 并尝试创建一个包含 URL 存储的头文件 以便您只需更改单个标志即可从调试更改为生产 这就是我试图用编译器做的事情 这显然是错误的 我找不到任何有关如何在 Objective C 中执行此操作的信息 所以这就是
  • SIMD 对超标量乱序 CPU 有什么好处?

    我一直在阅读最近可用的 AVX 512 说明 我觉得有一个基本概念我不理解 对于已经执行乱序执行的超标量 CPU SIMD 有什么好处 考虑以下伪汇编代码 使用 SIMD load 16 floats to register simd a