【问题标题】:Do sse instructions consume more power/energy?sse 指令是否消耗更多功率/能量?
【发布时间】:2013-11-12 10:17:33
【问题描述】:

很简单的问题,可能很难回答:

使用 SSE 指令(例如并行求和/最小/最大/平均操作)是否比执行任何其他指令(例如单个求和)消耗更多功率?

例如,在Wikipedia 上我找不到这方面的任何信息。

我能找到的唯一答案提示是here,但它有点笼统,在这方面没有参考任何已发表的材料。

【问题讨论】:

  • 我认为,如果您设法使 CPU 保持最大忙,它需要更多的功率。但这比 SSE 与标量更棘手。有几个 SSE 单元可以同时保持忙碌,您的代码不应该在内存访问等上等待太多。如果您使用标量/SIMD 指令执行相同数量的工作,SIMD 指令可能会更快,减少总能耗。
  • 这实际上取决于代码的优化程度 - 高度优化的代码使更多的执行单元保持忙碌并花费更少的时间等待例如负载停止,因此需要更多的功率。在运行相对于普通标量代码进行高度优化的 SIMD 代码时,我发现功耗(和 CPU 温度!)大幅增加。
  • @CodesInChaos,我怀疑标量/SIMD 的工作量是否相同。 SIMD 使用更多的晶体管来更快地并行工作。速度提高四倍可能会使用四倍以上的功率。 SIMD 也有可能共享一些并行计算的逻辑,并且比 x87 逻辑更优化,因此它使用更少的功率。但这是一个单独的点。
  • 我很惊讶没有一个答案提到 race to sleep 的概念:快速完成计算,这样您就可以在低功耗空闲状态下花费更多时间。与具有大量分支错误预测和缓存未命中的代码与使 256b FMA 单元饱和的代码之间的差异相比,低功耗空闲可以节省更多的电量。每个时钟周期切换的晶体管越多,CPU 使用的功率就越大。这么大的事情Haswell Xeons have a lower max clock speed when AVX code is active.

标签: performance x86 sse cpu-architecture energy


【解决方案1】:

几年前我实际上对此进行了研究。答案取决于您的问题到底是什么:

在当今的处理器中,功耗在很大程度上取决于指令类型(标量与 SIMD),而是由其他所有因素决定,例如:

  1. 内存/缓存
  2. 指令解码
  3. OOE,注册文件
  4. 还有很多其他的。

所以如果问题是:

所有其他条件相同:SIMD 指令是否比标量指令消耗更多功率。

对此,我敢说是的。

我的一个研究生项目最终变成了this answer:SSE2(2 路 SIMD)和 AVX(4 路 SIMD)的并排比较确实表明 AVX 的功耗明显更高和更高的处理器温度。 (虽然我不记得确切的数字。)

这是因为 SSE 和 AVX 之间的代码相同。只有指令的宽度不同。 AVX 版本的工作量翻了一番。

但如果问题是:

将我的代码向量化以使用 SIMD 会比标量实现消耗更多的功率。

这里涉及很多因素,所以我将避免直接回答:

降低功耗的因素:

  • 我们需要记住 SIMD 的目的是提高性能。如果您可以提高性能,您的应用将花费更少的时间来运行,从而节省您的电量。

  • 根据应用程序和实现,SIMD 将减少执行特定任务所需的指令数。那是因为您要为每条指令执行多项操作。

增加功耗的因素:

  • 如前所述,SIMD 指令比标量指令做更多的工作并且可以使用更多的功率。
  • 使用 SIMD 会引入标量代码中不存在的开销(例如 shuffle 和 permute 指令)。这些也需要经过指令执行流水线。

分解:

  • 指令更少 -> 发出和执行指令的开销更少 -> 功耗更低
  • 更快的代码 -> 运行更少的时间 -> 更少的功耗
  • SIMD 需要更多的权力来执行 -> 更多的权力

因此,SIMD 可以让您的应用花费更少的时间,从而为您节省电量。但是在运行时,它每单位时间消耗更多的功率。胜负视情况而定。

根据我的经验,对于从 SIMD(或任何其他方法)获得值得加速的应用程序,前者通常会胜出,并且功耗会下降。

这是因为运行时往往是现代 PC(笔记本电脑、台式机、服务器)功耗的主要因素。原因是大部分功耗不在 CPU 上,而是在其他所有方面:主板、内存、硬盘驱动器、显示器、空闲视频卡等......其中大部分都有相对固定的功耗。

对于我的计算机,仅将其保持在(空闲)状态下,其在全核 SIMD 负载(如 prime95 或 Linpack)下可以绘制的内容的一半以上。因此,如果我可以通过 SIMD/并行化使应用程序速度提高 2 倍,那么我几乎可以肯定地节省了电量。

【讨论】:

  • 非常有趣的实验!就我而言,使用 SSE 指令,我将重新设计我的算法以执行比标量版本更多的操作,但似乎时间更短。因此,正如我所担心的那样,如果我保持较低的 CPU 使用率(定义为我使用它的时间百分比),这并不意味着我会消耗更少的电量,而且我可能会更快地耗尽我的电池。我必须实施并对其进行基准测试。
  • @Mystical,这取决于加速是否真的是线性的。您可以对汽车使用相同的类比在 a 点和 b 点之间行驶,但我们知道摩擦不是线性的(风阻更像是速度 ^2),因此速度越慢可以节省更多功率(这就是他们将速度限制降低到 55 的原因70 年代的 MPG)。特别是由于并行加速可能不是 100% 所以很有可能一个使用 SSE 快 3.7 倍的算法最终比没有 SSE 的慢速算法使用更多的功率。
  • @Antonio 您可能会发现算法的运行时间将是功耗的主要因素。原因是闲置机器和满载机器之间的差异在典型台式机上很少超过 100W。而主板 + 电源 + 硬盘 + 其他一切往往加起来远不止这些。例如,在我的机器上,保持计算机开机的基准成本是 280W。在所有内核上的全 SIMD 负载下,它几乎没有达到 350W。因此,超过一半的电力使用是开销。
  • “因此,如果我可以通过 SIMD/并行化使应用程序速度提高 2 倍,那么我几乎可以肯定地节省了电量。”您在这里似乎没有正确使用电源,您没有节省电力,您正在节省能源(功率*时间)。不过,几乎可以肯定,我们在这里关心的是能源。如果长时间运行,处理器的频率/电压将按比例缩小以降低功耗,从而产生相似的功率水平,但运行时间减少,能耗降低。
  • 我认为正确的值是每瓦性能 (en.wikipedia.org/wiki/Performance_per_watt)。或每瓦的计算速率。它通常以 FLOPS/watt 为单位。
【解决方案2】:

这真的取决于你真正想知道什么。让我从我认为可能不关心所有其他功耗(例如主存储器)但只想知道他/她的单核逻辑中的功耗的处理器设计人员的角度来回答这个问题.那我有两个答案。

1.) 对于固定频率,由于实现 SIMD 的额外复杂性(电路逻辑),具有更快结果的 SIMD 内核可能比标量内核使用更多能量。

2.) 如果允许频率变化以使标量内核与 SIMD 内核同时完成,我认为 SIMD 内核使用的能量要少得多。

编辑:我将功率一词改为能量,因为功率是能量/时间。我认为比较合适的是 FLOPS/watt

让我解释一下。处理器的功率为C*V^2*f,其中 C 是电容,V 是电压,f 是频率。如果您阅读这篇论文Optimizing Power using Transformations,您会发现,在相同的时间内,以一半频率使用两个核心仅使用一个单一核心在全频下的 40% 的功率来进行相同的计算。

我认为同样的逻辑适用于其他并行方法,例如 SIMD 和 ILP(超标量)。因此,如果实现了 SIMD,则无需使用标量内核增加频率,而是可以使用更少的能量在相同的时间内完成相同的计算(另一方面,这会使编程变得更加困难)。

GPU 开发人员使用该论文的原理使他们在处理潜力方面领先英特尔几年(根据摩尔定律)。它们以比 CPU 更低的频率运行,并使用更多的“内核”,因此在相同数量的电能下,它们获得了更多潜在的处理能力。

【讨论】:

  • 我认为这是一篇不错的论文,但它可以追溯到 1995 年。
  • @Antonio,你有更多现代论文可以推荐吗?我想我是从 OpenCL 书中找到那篇论文的。
  • 不,我不知道。但是有时您可以尝试在引用它的论文中进行检查...scholar.google.de/…
  • 在同一 CPU 上比较相同算法的矢量化和非矢量化实现:如果矢量化的算法以 1/4 的时间运行(完美的 SIMD 加速),它在计算时可能会消耗更多功率,但不是 4 倍。因此它使用较少的总能量进行计算。如果这就是所有的工作,那么它会在剩余的时间里处于低功耗睡眠状态(race-to-sleep),而运行标量代码的核心仍在使用相当高的功率来跟踪乱序执行所有标量操作。
【解决方案3】:

正如 Mystical 的回答所暗示的那样,SIMD 代码往往会消耗更多的功率,但如果问题适合矢量化,则编写良好的 SIMD 代码将显着更快地运行;加速几乎总是大于功率的增加,这导致消耗的能量(功率随时间的积分)减少

这不仅适用于 SIMD 矢量化,而且适用于几乎所有优化。更快的代码不仅更快,而且(几乎普遍)更节能。

关于术语的细节:当人们真正想谈论“能量”时,他们经常谈论“权力”。如果您是工程电源(显而易见的原因)或工程外壳(因为您想知道需要多少能量才能以热量的形式散发),那么计算中的功耗实际上相关。 99.999% 的人没有参与其中任何一项活动,因此他们真的希望牢记能量(因为计算/能量是衡量程序效率的正确衡量标准)。

【讨论】:

  • 我认为常用的指标是计算速率/功率或 FLOPS/瓦特。但是,FLOPS 是计算/秒。瓦特是能量/秒,所以 FLOPS/瓦特实际上是计算/能量。
  • 正如您所说,FLOP/S/Watt 中的时间项取消,留给您计算/能量。不幸的是,FLOP/S/Watt 被如此广泛地引用,这有点令人困惑。 Ops/Joule 是一种更好(但很少使用)命名同一单位的方式。
  • 是的,但是 FLOPS/watt (computations/joule) 并没有告诉你任何关于速度的信息,它只告诉你关于能源使用的信息。如果目标是降低能源使用,那么 FLOPS/watt 将建议尽可能降低频率(或电压)(仅考虑核心并忽略所有其他能源成本)。这就是为什么我对 FLOP/watt(或 FLOPS/joule)不是一个通用指标感到惊讶的原因。我的意思是我认为计算/焦耳的速率比计算/焦耳更有趣。
  • 你的 nit 被误导了。由于微处理器仅通过电力获取能量,而“废”热以瓦特为单位,因此通过关注焦耳与瓦特来忽略执行所述操作所需的时间(速度)元素是没有意义的。否则算盘获胜。对于光学而不是电气或量子计算来说,这可能会发生变化,但对于电子半导体来说,功率是合理的单位。
  • @mctylr:废热以焦耳为单位。废热传递的瞬时速率以瓦特为单位。效率的正确衡量标准是“执行固定计算需要多少能量”。与预期相反,由于静态功耗考虑,这有利于更快完成计算。算盘不赢。
猜你喜欢
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2011-11-19
相关资源
最近更新 更多