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