Algorithm 算法复杂度:如何看;耗电量;作为参数?

Algorithm 算法复杂度:如何看;耗电量;作为参数?,algorithm,big-o,gpu,metal,Algorithm,Big O,Gpu,Metal,空间和时间被认为是分析算法复杂性的晴雨表。但是,随着GPU在移动设备上的出现,有许多可能的应用程序可以使用这种高性能在移动设备上运行复杂的算法。例如:iOS的金属框架可用于GPGPU操作。但不用说它消耗了大量的能量。所以,我的问题是,如果我在一个移动设备上开发/实现一个图形搜索算法,那么我也不应该考虑我的算法和时空的“功率”复杂性吗?现在,我知道论点可能是,权力是算法不会直接消耗自身的东西,我完全同意这一点。所以,也许我在这里的语法不正确,我说权力是衡量算法效率的另一个维度。但是,功率不应该被视

空间和时间被认为是分析算法复杂性的晴雨表。但是,随着GPU在移动设备上的出现,有许多可能的应用程序可以使用这种高性能在移动设备上运行复杂的算法。例如:iOS的金属框架可用于GPGPU操作。但不用说它消耗了大量的能量。所以,我的问题是,如果我在一个移动设备上开发/实现一个图形搜索算法,那么我也不应该考虑我的算法和时空的“功率”复杂性吗?现在,我知道论点可能是,权力是算法不会直接消耗自身的东西,我完全同意这一点。所以,也许我在这里的语法不正确,我说权力是衡量算法效率的另一个维度。但是,功率不应该被视为算法的性能度量吗?

要做到这一点,您需要一个能量消耗模型,可以与算法中的原子操作相关

就像“乘法器消耗一个单位的能量”和“内存插槽每单位时间使用两个单位的能量”。也许能量=时间x空间的关系是有意义的

无论如何,这样一个“幼稚”的模型可能会遭遇与时间复杂性模型相同的现象:它与现代建筑的行为没有任何相似之处,并且可能在数量级上是错误的

使用更精确的模型在分析上是困难的。

不。 复杂性解释了算法在时间/内存方面的扩展。功率是时间和记忆的函数

假设你有算法A-O(N^2)和B-O(N^3),它们都解决了同一个问题。对于n=1000,B使用1单位的功率,而A使用20单位的功率。现在,当你把它放大到n=10k时,B需要1000个单位的功率,而A只需要2000个单位的功率。在n=100k时,B需要1'000'000,而A需要20'000。等等
这假设在执行算法时能量消耗是恒定的

顺便说一句,同样的事情也会随着时间而发生。例如,对于短数组,没有什么比线性搜索更好


对于特定情况(以固定分辨率呈现UI),测量电源使用并对其进行优化是有意义的。但今天对解决方案起作用的东西明天未必是正确的。

我不知道能源消耗的任何形式化,但时间和空间可能在某种程度上是能源的有用替代物:更少的CPU周期需要更少的能源,更少的内存访问也需要更少的能源。有关设计用于最小化完成某些任务的能量消耗的算法的概述,请参见结论中提到的。有趣的想法。我认为,在大O意义上,功耗可以作为内存使用量随时间的积分来衡量,记住一些非零量的“内存”(至少是一个指令指针寄存器)只是为了让CPU在一个不做任何事情的循环中运行。对于许多算法,您只需要将最坏情况下的时间和内存需求相乘,但是这个框架会适当地奖励那些花费很短时间使用大量内存,但大部分时间使用很少的算法。我认为内存访问的数量并不能完全涵盖这一点:如果两个算法执行相同数量的访问,但是一台计算机需要n倍的计算值才能同时保持有效(即n倍的内存),那么它需要n倍的功率。当然,在现实世界的计算机上,它不需要n倍的功率,因为CPU的基本操作需要大量的功率,而不需要做任何事情——但是一个在其整个生命周期内使用固定数量m内存的算法的总功率成本t(我认为)可以合理地估计为+bmt,其中a是CPU和其他常开电路的一些固定成本,b是一些(相对于a而言较小)描述保持一字节内存有效的成本的系数。@j_random_hacker当我们考虑速度/电压缩放等因素时,它变得更加棘手,因为能耗是时钟速度的超线性函数(在CMOS中,类似立方,但这是一个非常粗略的经验法则)。“这假设在执行算法时能量消耗是恒定的。”——对于典型的现代CPU来说,这可能是一个合理的假设,但总功耗中必须有一个与保持活动的内存字节数成比例的项。例如,使用O(1)的O(n)算法字节内存使用的功耗必须比使用O(n)的O(n)算法的功耗渐进地小字节内存。能量=时间x空间是一个很好的开端。更精确的模型可以同时具有可处理性和现实性——看看Aggarwal等人的I/O复杂性模型的成功。对于具有两个不同内存级别的系统建模。@j_random_hacker:我宁愿相信精确的模型既不可处理也不现实但这只是一种观点:)