我的目标是针对某些特殊情况开发和实现绿色算法。我已经开发了两种相同的算法。
一个是大号没有。内存访问(加载和存储)。该模式是一段时间合并的,有些时间是非合并的。我假设一个最糟糕的情况,大多数访问将导致缓存失败。请参阅示例代码段a)。
另一个是大号没有。计算,大致相当于下面的代码片段b)。
如何估算每种情况下的功耗。哪一个更节能,为什么?
平台:我将在英特尔I3处理器上运行这些代码,Windows 7,4 GB DRAM,3 MB缓存。
注意:我不想使用任何外部功率计。如果您发现代码没有做任何建设性工作,请忽略。这是因为它只是完整算法的一小部分。
更新
这很困难,但并非不可能。人们可以很好地计算读取DRAM并通过CPU的ALU进行乘法所产生的成本。唯一需要的是必须具备DRAM和CPU的电子学知识,我在这个时间点缺乏。至少在最坏的情况下,我认为可以很好地建立起来。最坏的情况意味着没有合并访问,没有编译器优化。
如果您可以估算访问DRAM和进行浮点乘法的成本,那么为什么估算电流是不可能的,因此在这些操作期间大致了解功率?另见我的帖子,我不是在问有多少功耗,而是我在问哪个代码消耗更少/更多功率或者哪个代码更节能?
a) for(i=0; i<1000000; i++)
{
a[i]= b[i]; //a, b floats in RAM.
{
b) for(i=1; i<1000000; i++)
{
float j= j * i; //j has some value. which is used later in the program , not
// shown here
{
答案 0 :(得分:1)
像评论者指出的那样,尝试使用功率计。即使不是不可能,在现代超标量体系结构中,即使从原始汇编代码估算功率使用也很困难。
答案 1 :(得分:1)
要测量实际功耗,您应该使用electricity meter添加电源(如果使用笔记本电脑,请取出电池)。
请注意,您将测量整个系统的功耗,因此请务必避免滋扰参数(任何其他系统活动,即防病毒更新,图形桌面环境,索引服务,(内部)硬件设备),执行重复测量,无论您的算法运行与否,都可以取消“背景”消耗。 如果可能,请使用嵌入式系统。
关于算法,实际能效不仅取决于C代码,还取决于编译器的性能以及与周围系统交互时的运行时行为。但是,以下是一些资源,您可以作为开发人员为此提供帮助:
特别要看一下上面“清单”中的工具段落,因为它列出了一些可以帮助您进行粗略估算的工具(基于应用程序分析)。它列出(除了其他人):
答案 2 :(得分:0)
只要涉及CPU和内存,就可以假设功耗与运行时成正比。
这可能不是100%准确,但在没有实际测量的情况下尽可能接近。
答案 3 :(得分:0)
您可以尝试使用一些CPU监控工具来查看哪种算法可以为您的CPU带来更多热量。它不会为您提供可靠的数据,但会显示这两种算法在功耗方面是否存在显着差异。
这里我假设主要功耗消耗者是CPU,算法不需要繁重的I / O.
答案 4 :(得分:0)
好吧,我已经完成了与电子专业的初步研究和讨论。
通过考虑两个因素可以得到一个粗略的想法:
1-电流涉及:更多电流,更多功耗。
2-由于时钟频率导致的功耗。功耗随频率的平方而变化。
在Snippet中a)DRAM和存储器几乎不需要太多电流,所以每次的功耗都非常小
a[i]= b[i];
操作。上述操作只是数据读写。
与CPU相比,存储器的时钟通常也非常小。虽然CPU的时钟频率为3 GHz,但内存的时钟频率约为133 MHz左右。 (并非所有组件都以额定时钟运行)。因此,由于时钟较低,功耗较低。
在摘录b)中,可以看出我正在做更多的计算。由于几个更高的时钟频率,这将涉及更多的功耗。
另一个因素是乘法本身将包含几个更高的数量。与数据读写相比的周期(提供的存储器被合并)。
另外,对于某些代码,可以选择测量或大致了解功耗(“代码能量”),如下所示(颜色代表代码的节能效果,Red非常差) ,绿色高效节能):
简而言之,鉴于今天的技术,软件估算这样的功率并不是很困难(除了我上面描述的内容之外,还可能采用许多其他参数)。这对于更快地开发和评估绿色算法非常有用。