超线程/SMT 是一个有缺陷的概念吗?

2024-02-24

HT/SMT 背后的主要思想是,当一个线程停止时,同一核心上的另一个线程可以选择该核心的其余空闲时间并透明地与之一起运行。

2013 年,英特尔放弃了 SMT,转而采用乱序执行 Silvermont 处理器核心,因为他们发现这可以提供更好的性能 表现。

ARM 不再支持 SMT(出于能源原因)。 AMD从来不支持它。在野外,我们仍然有各种支持它的处理器。

从我的角度来看,如果数据和算法的构建是为了不惜一切代价避免缓存未命中和后续处理停顿,那么超线程肯定是多核系统中的冗余因素吗?虽然我意识到所涉及的上下文切换的开销较低,因为两个超线程的离散硬件存在于同一物理内核中,但我看不出这比根本没有上下文切换更好。

我建议任何need超线程指出了软件设计的缺陷。我在这里缺少什么吗?


超线程是否有帮助以及有多大帮助取决于线程正在做什么。它不仅仅是在一个线程中完成工作,而另一个线程等待 I/O 或缓存未命中 - 尽管这是基本原理的重要组成部分。它涉及有效利用 CPU 资源来提高系统总吞吐量。假设你有两个线程

  1. 一个有很多数据缓存未命中(空间局部性差)并且不使用浮点,空间局部性差不一定是因为程序员做得不好,某些工作负载本质上就是如此。
  2. 另一个线程正在从内存中传输数据并进行浮点计算

通过超线程,这两个线程可以共享同一个 CPU,一个正在执行整数运算并导致缓存未命中和停止,另一个正在使用浮点单元,并且数据预取器远远领先于内存中的顺序数据。系统吞吐量比操作系统在同一 CPU 核心上交替调度两个线程要好。

英特尔选择不在 Silvermont 中包含超线程,但这并不意味着它将在高端 Xeon 服务器处理器甚至针对笔记本电脑的处理器中取消它。选择处理器的微架构需要权衡,有很多考虑因素:

  1. 目标市场是什么(将运行什么样的应用程序)?
  2. 目标晶体管技术是什么?
  3. 绩效目标是什么?
  4. 功率预算是多少?
  5. 目标芯片尺寸是多少(影响良率)?
  6. 它在公司未来产品的性价比范围内处于什么位置?
  7. 目标推出日期是哪一天?
  8. 有多少资源可用于实施和验证设计?添加微架构功能会增加非线性的复杂性,与其他功能存在微妙的相互作用,目标是在第一次“流片”之前识别尽可能多的错误,以最大程度地减少在完成之前必须完成的“步骤”一个工作芯片。

Silvermont 的每核心芯片尺寸预算和功耗预算排除了乱序执行和超线程的可能性,而乱序执行提供了更好的单线程性能。这是 Anandtech 的评估 http://www.anandtech.com/show/6936/intels-silvermont-architecture-revealed-getting-serious-about-mobile/3:

如果我必须用 Silvermont 来描述英特尔的设计理念,那就是合理的扩展。我们从 Apple 的 Swift 以及高通的 Krait 200 到 Krait 300 的过渡中看到了这一点。请记住最初 Atom 的设计规则:性能每提高 2%,Atom 架构师最多可以将功率提高 1%。换句话说,性能可以上升,但每瓦性能不能下降。 Silvermont 坚持这种设计理念,我想我知道如何做到这一点。

Atom 的早期版本使用超线程技术来充分利用执行资源。超线程会带来一定的功耗损失,但性能的提升足以证明它的合理性。在 22 纳米工艺中,英特尔拥有足够的芯片面积(得益于晶体管缩放),只需添加更多内核即可,而不是依靠 HT 来获得更好的线程性能,因此超线程被淘汰。英特尔通过摆脱超线程技术节省的电量随后被分配到使 Silvermont 成为无序设计,这反过来又有助于在没有超线程的情况下提高执行资源的有效利用。事实证明,在 22 纳米工艺下,英特尔用于启用 HT 的芯片面积与 Silvermont 的重排序缓冲区和 OoO 逻辑大致相同,因此此举甚至没有面积损失。

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

超线程/SMT 是一个有缺陷的概念吗? 的相关文章

  • 在 .NET 并发线程之间传递数据的最佳方式是什么?

    我有两个线程 一个需要轮询一堆单独的静态资源以查找更新 另一种需要获取数据并将其存储在数据库中 线程1如何告诉线程2有东西要处理 如果数据块是独立的 则将数据块视为要由线程池处理的工作项 使用线程池和QueueUserWorkItem将数据
  • 匹配集合 Parallel.Foreach

    我正在尝试为 matchcollection 创建一个 Parallel Foreach 循环 它在我构建的刮刀中 我只需要知道在 Parallel Foreach 中放入什么 MatchCollection m Regex Matches
  • Java基于参数的同步(名为互斥锁/锁)

    我正在寻找一种根据接收到的参数来同步方法的方法 如下所示 public synchronized void doSomething name some code 我想要方法doSomething同步基于name参数如下 线程 1 doSom
  • Play 框架:异步与同步性能

    我有以下代码 def sync Action val t0 System nanoTime Thread sleep 100 val t1 System nanoTime Ok Elapsed time t1 t0 1000000 0 ms
  • INotifyPropertyChanged 和线程

    我有一个基类实现INotifyPropertyChanged protected void OnNotifyChanged string pName if PropertyChanged null PropertyChanged this
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • 使用 boost 线程和非静态类函数

    所以我做了一些研究 发现你可以创建一个 boost thread 对象 并通过使用 this 和 boost bind 等以非静态类函数开头 这确实没有多大意义对我来说 我能找到的所有示例都在与其启动的函数相同的类中启动了 boost th
  • Python `concurrent.futures`:根据完成顺序迭代 future

    我想要类似的东西executor map 除了当我迭代结果时 我想根据完成的顺序迭代它们 例如首先完成的工作项应该首先出现在迭代中 等等 这样 当且仅当序列中的每个工作项尚未完成时 迭代就会阻塞 我知道如何使用队列自己实现这一点 但我想知道
  • “威胁已经被清除了。”在测试中测试在后台线程上触发委托的代码

    我有一些旧代码正在尝试为其编写测试 该代码解析日志文件 在后台线程上 完成后触发传入的委托 i e public delegate void finread LogData l LRParseState l string e void Th
  • C++11:atomic::compare_exchange_weak 是否支持非原始类型?

    我有以下代码 include
  • “gi.repository.Gtk”对象没有属性“gdk”

    我正在尝试使用 GTK 创建多线程 需要 Gtk gdk 但我收到有关没有 gdk 属性的错误 我正在使用带有 Raspbian 的 Raspberry Pi 这就是我导入 GTK 库的方式 try import pygtk pygtk r
  • “while(true) { Thread.Sleep }”的原因是什么?

    我有时会遇到以下形式的代码 while true do something Thread Sleep 1000 我想知道这是否被认为是好的做法还是坏的做法以及是否有任何替代方案 通常我在服务的主函数中 找到 这样的代码 我最近在 Windo
  • 在 OSX 上,Java 线程在不关注时会进入睡眠状态

    我正在编写一个程序来监听系统剪贴板的更改 侦听器在单独的线程上运行 并在剪贴板的内容更改时执行某些操作 例如写入文件 我正在使用轮询剪贴板剪贴板所有者界面 http www javapractices com topic TopicActi
  • 使用 volatile 关键字时出现内存一致性错误的示例?

    来自文档 使用易失性变量可以降低内存一致性错误的风险 但这是否意味着有时易失性变量无法正常工作 奇怪的是它的使用方式 在我看来 这是非常糟糕的代码 有时工作有时不工作 我尝试谷歌 但没有找到易失性内存一致性错误的示例 您能推荐一个吗 问题不
  • 如何在不同的QT线程中创建一个窗口?

    我有一个应用程序 其中每个线程 主线程除外 都需要创建自己的窗口 我尝试创建一个线程然后调用this gt exec in the run功能 然而 在我接到那个电话之前我就收到了一个错误 ASSERT failure in QWidget
  • Shared Web Workers 是否会在单页重新加载、链接导航中持续存在

    共享网络工作者 http www whatwg org specs web apps current work shared workers introduction旨在允许来自同一站点 来源 的多个页面共享单个 Web Worker 但是
  • java中线程之间的通信:如果另一个线程完成则停止一个线程

    仅当另一个线程也在运行时 如何才能使一个线程运行 这意味着 如果我从一个线程中的运行返回 那么我希望另一个线程也停止运行 我的代码看起来像这样 ClientMessageHandler clientMessagehandler new Cl
  • 未从线程接收位置数据

    我尝试使用计时器经常发送包含用户位置的短信 最初 我遇到了空指针异常 这是由于我犯了一个简单的错误 一旦解决了这个问题 一切似乎都运行良好 但是 它永远不会获取我的位置 因此 不断发送的文本显示 无法接收位置 我想问的是为什么它无法获取我的
  • Time 方法在另一个线程中执行并在超时时中止

    您好 我正在尝试异步运行方法 以便计算持续时间并在超过超时时取消该方法 我尝试使用异步和等待来实现这一点 但没有运气 也许我过度设计了这个 任何输入都会受到赞赏 应该注意的是 我无法更改接口 TheirInterface 因此得名 到目前为
  • 同时运行 x 个网络请求

    我们公司有一个网络服务 我想通过我自己的服务发送 XML 文件 存储在我的驱动器上 HTTPWebRequestC 中的客户端 这已经有效了 Web服务同时支持5个同步请求 一旦服务器上的处理完成 我就会从Web服务获得响应 每个请求的处理

随机推荐

  • JVisualVM 内存采样:不支持远程应用程序

    我正在尝试在 Red Hat Linux 中使用 JVisualVM 监视远程 tomcat 进程 CPU 采样工作正常 但内存采样选项卡被禁用 它说 内存采样 不可用 不支持远程应用程序 进程的命令行参数 Djavac source 1
  • 如何在 aspx 页面中包含 adovbs.inc 文件?

    我正在将 ASP 经典页面转换为 ASP NET 将扩展名为 inc 的文件包含到 aspx 页面的正确方法是什么 我注意到 每次我将包含指向 inc 文件的 include 指令的页面之一更改为 aspx 时 我都会从这些 inc 文件中
  • 如何在 C++ 中跟踪 BFS 深度

    我想对二维数组进行BFS 每个单元格可以表示为pair
  • PHP bcompiler 编码的代码有多安全?

    我很感兴趣是否有人确切知道 PHP 的有效性 安全性 受保护程度b编译器 http www php net manual en intro bcompiler php反对逆向工程 简介页面做出了大胆的声明 在代码保护方面 可以肯定地说 如果
  • 如何在受 AWS Linux AMI 限制的情况下,将 SoX 二进制文件打包为 NodeJS AWS Lambda 函数的 MP3 支持?

    过去三个月我一直在研究这个问题 但完全陷入困境 我正在尝试打包我的 NodeJS AWS Lambda 函数 该函数将使用SoX http sox sourceforge net以及将音频文件转换为 MP3 的依赖项 我可以按照引用的说明让
  • Grails 2.3.7 删除 itext 2.0.8 jar

    我尝试将应用程序从 grails 2 2 4 更新到 2 3 7 但 iText 依赖项存在问题 执行 grails 资源依赖项显示我有 2 个用于 iText 的 jar org grails grails docs 2 3 7 org
  • 如何读取haskell类型签名?

    所以我把这个声明放在我的ghci上 jkl x f y f map y x 我把这个放回去了 jkl Num b gt b gt b gt t gt b gt t 但当我读到它时我很困惑 根据我的理解 jkl 是 num 类型 它采用 b
  • 如何用 gulp-rev 的输出替换 index.html 中列出的文件名?

    我在用着gulp rev https www npmjs org package gulp rev 构建我可以设置的静态文件永不过期 http developer yahoo com performance rules html expir
  • 使用服务帐户访问 Google Analytics API

    我可以使用客户端应用程序中的服务帐户访问 Google Analytics 数据吗 如果没有 是否有其他方法可以达到相同的结果 必须完全是客户端的 并且不能要求用户进行身份验证 因此需要使用服务帐户 是的 你可以在https code go
  • 用于 DOM 的 Gecko API

    Gecko 是否公开了直接使用其 DOM 的 API 我正在寻找像 HtmlElement 这样的类 可用于构建 遍历 HTML 内容树 我正在尝试将 Gecko 作为桌面应用程序中的 Web 浏览器控件托管 并且更喜欢直接 API 而不是
  • NuGet Pack:忽略默认包含

    这与我通常读到的问题相反 即人们试图获取 NuGet 包中包含的文件 我试图stop文件被自动包含 我正在创建一个预编译的 MVC 视图模板库 使用 RazorGenerator Mvc less文件和 JavaScript 来根据需要支持
  • 如何为 Flutter 中禁用的文本表单字段标签设置颜色主题?

    我想在我的 Flutter 应用程序中禁用文本字段的标签上应用一个主题 因为我现在的灰色很难阅读 我想将其应用到我的整个应用程序 所以我想使用主题 但是 我没有找到任何解决方案可以让我自定义标签的文本样式仅当文本表单字段被禁用时 如何在 F
  • Thunderbird 议程本机系统通知? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 几周来我一直在寻找这个问题的答案 我想我可能会直接问这个问题 我在 Windows 10 上使用 Thunderbird 102 6
  • 使用 PHP 5.5 在 Amazon EC2 上安装 pdo_mysql

    我创建了一个 Amazon Linux AMI 2013 09 02 服务器并安装了以下内容 yum install php55 php55 mbstring php55 soap php55 gd php55 mcrypt php55 p
  • 在 Procfile 中启动多个工作进程(开发环境与 Heroku)

    我有一个简单的 Procfile 内容如下 web bundle exec rails server thin p PORT worker bundle exec rake jobs work 在 Heroku 上 这将启动 N 个工作任务
  • Java HashMap 数组大小

    我正在阅读Java 8 HashMap的实现细节 谁能告诉我为什么Java HashMap初始数组大小具体是16 16岁有什么特别之处 为什么总是两个人的力量 谢谢 2 的幂之所以到处出现 是因为当用二进制表示数字时 就像在电路中一样 2
  • 我们如何为 pom.xml 创建一个 build.gradle 等效文件来构建和部署 AEM 代码?

    我正在尝试创建一个构建 gradle文件 例如完整的 pom xmlAEM Maven 原型 https github com Adobe Marketing Cloud aem project archetype or 懒骨头模板 htt
  • 将 id 分开并存储在两个不同的数组中

    NSString string vlaue Highlight 1234 1235 1236 1237 Issuer 100 101 102 103 我需要将 1234 1235 1236 1237 存储在一个数组中 100 101 102
  • 自动激活Maven中的父插件

    是否可以在父 POM 中定义一个已停用的插件 并且当子项目继承此插件时 它会自动激活 我猜您想在父 pom 中配置该插件 但仅在继承的项目中使用它 Maven 有一个专门的部分 在pluginManagement 中配置你的插件 但在你需要
  • 超线程/SMT 是一个有缺陷的概念吗?

    HT SMT 背后的主要思想是 当一个线程停止时 同一核心上的另一个线程可以选择该核心的其余空闲时间并透明地与之一起运行 2013 年 英特尔放弃了 SMT 转而采用乱序执行 Silvermont 处理器核心 因为他们发现这可以提供更好的性