非常简单的问题,可能很难回答:
使用SSE指令(例如并行和/最小/最大/平均操作)是否比执行任何其他指令(例如单个总和)消耗更多功率?
例如,在Wikipedia上,我找不到这方面的任何信息。
我能找到的答案的唯一提示是here,但它有点通用,并且没有提及这方面的任何出版材料。
答案 0 :(得分:28)
在今天的处理器中,功耗并不是由指令类型(标量与SIMD)决定的,而是其他所有因素,例如:
所以如果问题是:
所有其他条件相同:SIMD指令消耗的功率是否超过标量指令。
为此,我敢说是。
我的一个研究生院项目最终成为this answer:SSE2(双向SIMD)和AVX(4路SIMD)的并列比较事实上表明AVX的成绩明显更高功耗和更高的处理器温度。 (我不记得确切的数字。)
这是因为SSE和AVX之间的代码是相同的。只有指令的宽度不同。 AVX版本确实使工作量增加了一倍。
但如果问题是:
对我的代码进行矢量化以使用SIMD会比标量实现消耗更多的功率。
这里涉及众多因素,所以我会避免直接回答:
降低功耗的因素:
我们需要记住,SIMD的目的是提高性能。如果你可以提高性能,你的应用程序将花费更少的时间来运行,从而节省你的力量。
根据应用程序和实现,SIMD将减少执行特定任务所需的指令数量。那是因为你在每条指令上做了几次操作。
增加耗电量的因素:
打破它:
因此,SIMD可让您的应用花费更少的时间,从而为您节省电量。但在运行时,每单位时间消耗的能量更多。谁获胜取决于具体情况。
根据我的经验,对于从SIMD(或任何其他方法)获得有价值加速的应用程序,前者通常会获胜并且功耗会下降。
这是因为运行时间往往是现代PC(笔记本电脑,台式机,服务器)功耗的主导因素。原因在于大部分功耗不在CPU中,而在于其他所有功能:主板,内存,硬盘,显示器,空闲视频卡等......其中大部分都具有相对固定的功耗。
对于我的计算机来说,保持打开(空闲)已经占据了在全核心SIMD负载(例如prime95或Linpack)下可以绘制的内容的一半以上。因此,如果我可以通过SIMD /并行化将应用程序的速度提高2倍,那么我几乎可以节省电力。
答案 1 :(得分:6)
正如Mystical的回答所暗示的那样,SIMD代码往往会略微更多的功能,但如果问题适合于矢量化,那么编写良好的SIMD代码将会更快地运行 ;加速几乎总是大于功率的增加,这导致消耗的能量(功率随时间的积分)减少。
这不仅适用于SIMD矢量化,而且几乎适用于所有优化。更快的代码不仅更快,而且(几乎普遍)更节能。
关于术语的一句话:当人们想要谈论“能量”时,人们经常谈论“权力”。如果您正在设计电源(显而易见的原因)或工程机箱(因为您想知道需要多少功率才能分散为热量),计算中的功耗实际上只与相关相关。 99.999%的人没有参与其中任何一项活动,因此他们真的想要记住能量(因为计算/能量是计划效率的正确衡量标准)。
答案 2 :(得分:3)
这实际上取决于你真正想知道的。让我从我认为可能不关心所有其他功耗(例如主存储器)的处理器设计者的角度来回答这个问题,但只想知道他/她在单个内核中的逻辑功耗。那时我有两个答案。
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,并使用更多的“核心”,因此对于相同数量的电能,它们可以获得更大的潜在处理能力。