现代英特尔处理器有多少种超标量方式?

2023-12-27

我刚刚了解了超标量处理器(https://en.wikipedia.org/wiki/Superscalar_processor https://en.wikipedia.org/wiki/Superscalar_processor).

我还了解到,随着超标量处理器宽度/方式数量的增加,事情会变得更加复杂,并且复杂性增加得如此之快,因此最好添加更多核心而不是更多宽度。我的导师说,在 4 路和 8 路超标量之间添加更多方法不再值得。

这让我想知道:英特尔在哪里停止添加方式并开始添加核心?我的英特尔第 8 代酷睿 i7 的每个核心有多少种方式?

方式的概念是否适用于这些处理器?


See Agner Fog 的微架构指南 https://agner.org/optimize/对于这样的管道详细信息。https://www.realworldtech.com/haswell-cpu/ https://www.realworldtech.com/haswell-cpu/还通过框图对 Haswell 进行了深入研究。 (以及 David Kanter 关于其他 uarches 的一些文章的链接,例如 SnB 和 Core2,以及 AMD Bulldozer 和 K8。)还有其他链接https://stackoverflow.com/tags/x86/info https://stackoverflow.com/tags/x86/info

是的,现代 x86 核心是超标量乱序执行。自 PPro 以来,基本原理没有改变:将 x86 机器代码解码为可由 ROB + RS 调度的微操作 (uops)。


(术语:Intel 使用“issue”表示“复制到无序后端”,“dispatch”表示“从调度程序发送到执行单元”,分配资源并更新 RAT。在计算机体系结构领域的其他许多领域,人们使用相反的术语。)

自 Core 2 以来,Intel 在发布/重命名/分配阶段是 4 uops 宽的超标量,这是最窄的瓶颈。(在此之前,从 PPro 到 Pentium-M,都是 3 宽。)Core 2 在实践中很少能维持这种状态,因为有太多其他瓶颈。 Skylake 在高吞吐量代码中通常可以非常接近。

为了让每个融合域 uop 进行更多工作,ALU uop 与其内存源负载进行了微融合。以及宏观融合,例如cmp/test + jcc 因此比较和分支指令一起解码为一个 uop。 (请参阅 Agner Fog 的微架构指南)。这包括您的 Kaby 或 Coffee Lake CPU。最大未融合域持续吞吐量为每个时钟 7 uop,Skylake 实践中可实现 https://www.agner.org/optimize/blog/read.php?i=857。在突发情况下,调度程序可以将微指令分派到每个端口。

Ice Lake (Sunny Cove uarch) 将问题阶段扩大到 5。

AMD Zen 的宽度为 6 uops,但只有 5指示 wide,因此当运行至少一些 2 uop 指令时,它只能达到 6 uop/时钟。例如256 位 AVX SIMD 指令将其解码为 2x 128 位一半(或者对于跨车道洗牌来说更糟)。


Skylake 将传统解码器扩展到 5 uops/时钟,并将 uop 缓存获取从 SnB 中的 4 uops 通过 Broadwell 提高到 6 uops/时钟。这会更多地隐藏前端气泡,并在高吞吐量代码中更多地让问题/重命名阶段每时钟输入 4 个微指令。 (阶段之间有缓冲区/队列,例如为问题/重命名阶段提供数据的 64 uop IDQ。)

这包括您的 Kaby 或 Coffee Lake CPU:在微架构上,KBL 中的 IA 核心与 SKL 相同,而 Coffee Lake 是一个非常小的调整(修复了由于部分寄存器合并 uop 而 SKL 必须在微代码更新中禁用的循环缓冲区)勘误表,又名 CPU 错误)。 KBL 和 CFL 的 GPU 比 SKL 更好,但 x86 内核基本相同。


是的,对于大多数代码来说,超过 3 或 4 宽的收益递减,但 SMT 可以让宽核同时在两个(或 4 或 8)个执行线程中找到 ILP。这使得更宽的核心不会被浪费,但核心的成本与宽度的关系大于线性比例,因此只有在以下情况下才这样做有时单个线程可以使用该宽度的大部分。否则你只会构建更多更小的核心。 (至少如果你有一个可扩展的互连用于更多核心......)我的回答为什么不制造一个大的CPU核心呢? https://electronics.stackexchange.com/questions/443186/why-not-make-one-big-cpu-core/443342#443342关于电子产品。SE 提供了有关实际工作负载中可用的权衡和有限 ILP 的更多详细信息。

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

现代英特尔处理器有多少种超标量方式? 的相关文章

  • 处理负整数的汇编 MASM

    我被指示用汇编语言编写一个程序 该程序将执行以下算术 A B C D A E 当没有负值发挥作用时 我成功地做到了这一点 但假设 A 5 B 4 C 3 D 2 和 E 1 这给了我们 5 4 3 2 5 1 或 6 这就是我需要帮助的地方
  • 如何正确确定Intel处理器的-march和-mtune?

    我目前正在从源代码构建一个对我来说性能至关重要的软件 因此 我想对其进行优化 以便在我的特定 Intel CPU 上运行 构建过程要求我设置 march 和 mtune 标志 如果在我的处理器节点上我使用 gcc march native
  • 链接描述文件未按预期跳过字节

    因此 我有这个汇编文件 我使用 GNU as 进行汇编 并使用链接器脚本与 GNU ld 进行链接 链接描述文件 boot ld INPUT boot o OUTPUT boot out ENTRY boot start SECTIONS
  • 早期的BIOS怎么能使用CALL呢?

    我纯粹是出于爱好原因 试图理解 PC 中的一些低级代码 我为随机的旧千兆字节 MB 下载了一个过时的 BIOS ROM 映像 https www gigabyte com Motherboard GA 8I845GE775 G rev 10
  • 如何在汇编程序中使用 C 库?

    我想知道如何用汇编语言编写文本编辑器 但现代操作系统需要 C 库 特别是对于它们的窗口系统 我找到了这个page http pengu1n is programmer com posts 8304 html 这对我有很大帮助 但我想知道是否
  • x86 实模式下的段大小

    我对实模式下段的大小有一个疑问 因为它们不能超过 64K 但可以小于那个 http support microsoft com kb 120069 我的问题是这些段大小和基地址是如何初始化的 就像保护模式下有 GDT 和 LDT 一样 实模
  • 分配内存空间的宏

    我需要让一个汇编程序员来计算帕斯卡三角形 https en wikipedia org wiki Pascal 27s triangle 这样帕斯卡三角形的每一行都与其他行分开存储在内存中 我想做一个 但我不知道如何使用宏在汇编中做到这一点
  • 跨 AVX 通道的最佳方式是什么?

    有些问题具有类似的标题 但我的问题涉及其他地方未涵盖的一个非常具体的用例 我有 4 个 128d 寄存器 x0 x1 x2 x3 我想将它们的内容重新组合在 5 个 256d 寄存器 y0 y1 y2 y3 y4 中 以准备其他计算 on
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 为 Visual Studio 应用程序设置平台目标的目的是什么?

    对于任何 VS 项目 都可以在该项目的构建属性中设置平台目标 您可以将其设置为任何 CPU x86 x64 或 Itanium 我的问题是 如果我将此值设置为 x86 是否意味着我无法在 x64 计算机上运行该项目 如果是这样 为什么还要使
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 当我打开在 Xcode 4 中创建的 Google 地图项目时,Xcode 5 会警告我的架构设置

    我刚刚更新到新发布的 Xcode 5 我正在开发一个使用 Google 地图 iOS SDK 的 iOS 应用程序 当我在 Xcode 4 中开发时 我改变了我的Architectures在我的项目设置中进行设置 按照 Google 的步骤
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会

随机推荐

  • 企业库错误

    我收到有关我们的生活环境中罕见的间歇性错误的报告 我试图重现它但没有成功 而且这个错误本身有点神秘 除此之外 它似乎涉及企业库跟踪 我们使用的是 5 0 版本 总而言之 有点痛苦 这发生在 Windows Sever 2008 上 应用程序
  • Windows 8 应用程序本地存储

    我正在尝试使用 C 开发 Windows 8 应用程序 我需要在本地设置中存储两个列表 字符串和日期时间 List
  • HTTP/2 中是否有必要缓存bust?

    在 HTTP 1 中 为了避免额外的网络请求来确定资源是否应该保留缓存 我们将设置一个高值max age or Expires静态资产的值 并为每个修订版提供唯一的 URL 但在 HTTP 2 中 请求很便宜 所以我们可以在不清除缓存的情况
  • 有没有一种简单的方法可以从两个整数复合键创建唯一的整数键?

    由于与问题不太相关的各种原因 我有一个表 其中包含由两个整数组成的复合键 我想从这两个数字中创建一个唯一的键 我最初的想法是连接它们 但当我意识到 51 1 的复合键会产生与 5 11 相同的唯一键 即 511 时 我很快遇到了问题 有没有
  • 以编程方式访问 Excel 自定义文档属性

    我正在尝试将自定义属性添加到以编程方式创建的工作簿中 我有一个用于获取和设置属性的方法 但问题是工作簿为 CustomDocumentProperties 属性返回 null 我无法弄清楚如何初始化此属性 以便我可以从工作簿中添加和检索属性
  • PHP - 使用 GZIP 压缩静态 css 文件

    所以我有一个CSS文件 style css 在同一目录中我有 images 文件夹 如何制作一个压缩 style css 的脚本 但来自另一个文件夹 现在我有这个
  • 更新数百万个文档的嵌套字段

    我使用脚本进行批量更新来更新嵌套字段 但这非常慢 POST index type bulk update id 1 script inline ctx source nestedfield add params nestedfield pa
  • Agda 函数、类型匹配函数

    我想创建一个辅助函数 它将从索引或参数化类型中获取术语并返回该类型参数 showLen len A Set gt Vec A len gt showLen len showType len A Set gt Vec A len gt Set
  • 测试点是否在匹配的引号之间 (emacs lisp)

    我们如何检查是否 point 在匹配的 引号 内 示例 1 point 但不在范围之内 示例 2 此处引用 point 那里引用 在 Emacs Lisp 中 您正在寻找的是syntax ppss 定义于syntax el 它返回 10 个
  • 如何在Python中捕获自定义异常[重复]

    这个问题在这里已经有答案了 我正在使用一个 python 库 其中在某一时刻定义了一个异常 如下所示 raise Exception Key empty 我现在希望能够捕获该特定异常 但我不知道该怎么做 我尝试了以下方法 try raise
  • C++ 中的比较性能( foo >= 0 与 foo != 0 )

    我最近一直在写一段代码 其中性能非常重要 基本上我有以下情况 int len some very big number int counter some rather small number for int i len i gt 0 i
  • flutter:带有后备文本的 CircleAvatar

    我正在学习 Flutter 想做一个Widget就像内置的一样CircleAvatar 但是 我希望这种行为是 指定图像 NetworkImage 和缩写 即 BB 当图像未加载时 显示缩写 如果图像加载 则显示图像并删除缩写 下面的代码可
  • 实现惰性函数式语言

    当实现惰性函数式语言时 有必要将值存储为未计算的 thunk 仅在需要时才进行计算 有效实施的挑战之一 如在例如中所讨论的 无脊椎无标签 G 机 是这个评估必须对每个重击执行一次 并且后续访问必须重用计算值 如果不这样做将导致至少二次方减速
  • 为什么我无法减小该文本的行高?

    http jsfiddle net mJxn4 http jsfiddle net mJxn4 这很奇怪 我有几行文本包裹在 em 标签 无论我做什么 都会降低价值line height低于 17px 没有效果 我可以撞line heigh
  • Flash/Flex 跨域问题 - 对来自 AWS S3 的图像使用 BitmapData.draw() 会导致 SecurityError:错误 #2122:违反安全沙箱

    我在 DisplayObject 上使用 BitmapData draw 其中包含来自我的 AWS S3 存储桶的图像 当我将 S3 图像 URL 设置为 Image 对象的源时 图像在 swf 中加载正常 但当我在其上使用 BitmapD
  • magento 中的货币符号

    我用两种不同的语言创建了两个 Magento 商店视图 English Dutch 英语 EURO 货币符号以正确的方式出现 例如 20 00 但对于荷兰语视图 它显示为 20 00 EUR 我想为两种视图设置默认符号 因为欧元是相同的 我
  • 哪个 magento 表包含产品图像名称?

    我遇到的问题是我使用 Magmi magento 产品导入开源解决方案 导入产品 但我在前端看不到产品图像 我需要知道 magento 数据库中的哪个表包含图像名称 以便我可以直接以某种方式提供它 Catalog product entit
  • PHP 停用词列表

    我正在代码中使用停止词 我有一个充满我想要检查的单词的数组 以及一个我想要检查的单词数组 目前 我一次循环一个数组 并删除该单词 如果其 in array 与停用词列表 但我想知道是否有更好的方法来做到这一点 我已经查看了 array di
  • 有没有办法同时查看两个 Laravel Mix Webpack 配置文件是否有任何更改?

    使用 Laravel Mix 是否可以使用一个命令查看两个 Webpack 配置文件 以便对任何底层文件的更改立即导致必要的文件被编译 具体来说 我有以下两个与 Laravel Mix 一起使用的 Webpack 配置文件 webpack
  • 现代英特尔处理器有多少种超标量方式?

    我刚刚了解了超标量处理器 https en wikipedia org wiki Superscalar processor https en wikipedia org wiki Superscalar processor 我还了解到 随