【发布时间】:2012-06-16 04:43:54
【问题描述】:
我的目标是针对某些特殊情况开发和实施绿色算法。我为此开发了两种算法。
一个是没有大的。内存访问(加载和存储)。该模式有时是合并的,有时是非合并的。我假设最坏的情况是大多数访问都会导致缓存失败。请参阅示例代码 sn-p a)。
另一个是大号。的计算,大致相当于下面的代码 sn-p b)。
如何估算每种情况下的功耗。哪一个更节能,为什么?
平台:我将在 Intel I3 处理器、Windows 7、4 GB DRAM、3 MB 缓存上运行这些代码。
注意:我不想使用任何外部功率计。如果您发现代码没有做任何建设性的工作,也请忽略。这是因为它只是完整算法的一小部分。
更新:
这很困难,但并非不可能。人们可以很好地计算出读取 DRAM 和 CPU 的 ALU 进行乘法的成本。唯一的一点是必须具备 DRAMS 和 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
{
【问题讨论】:
-
这些在做完全不同的事情;比较它们是什么意思?另外,第二个例子是胡言乱语;它根据自身计算一个局部变量,然后丢弃它。
-
尝试在您的目标平台上运行代码并使用功率计监控功耗 - 这是 100% 确定是否存在显着差异的唯一方法。
-
孤立地估计代码位的功耗可能是不可能的;还有太多其他事情发生了(您需要查看编译器优化的结果,而不是原始来源)。我的建议是简单地运行您的代码,并用仪表测量功耗。
-
@OliCharlesworth,我只向您展示了算法的一小部分,因此您可能会将其视为完全不同的东西,尽管您不必为此担心。我只是需要一个关于代码功耗的逻辑视图。
-
当其他程序启动(例如服务)时,您可以增加分页。页面错误需要 IO,并且可能会显着改变电源使用情况。无论单个程序与可能消耗能量的虚拟内存的交互效率如何,(普通)单个程序都无法控制。