【问题标题】:Battery Power Consumption between C/Renderscript/Neon Intrinsics -- Video filter (Edgedetection) APKC / Renderscript / Neon Intrinsics之间的电池功耗-视频过滤器(Edgedetection)APK
【发布时间】:2026-01-23 06:20:02
【问题描述】:

我使用 Android NDK(使用 C++ API 进行 Renderscript)开发了 3 个 C/RS/Neon-Intrinsics 版本的视频处理算法。对 C/RS/Neon 的调用将从 JAVA 前端转到 NDK 端的 Native 级别。我发现由于某种原因,与 C 和 RS 版本相比,Neon 版本会消耗大量功率。我使用 Trepn 5.0 进行功率测试。

  1. 能否有人向我解释一下这些方法 C、Renderscript - GPU、Neon Intrinsics 中每种方法的功耗水平。哪个消耗最多?

  2. RS 代码的理想功耗水平是多少?因为 GPU 以较低的时钟频率运行,功耗必须更低!

  3. Renderscript API 是否专注于电源优化?

视频 - 1920x1080(20 帧)

  1. C -- 11115.067 ms (0.80mW)
  2. RS -- 9867.170 毫秒 (0.43mW)
  3. Neon 本征 -- 9160 毫秒 (1.49mW)

【问题讨论】:

  • 如果实施得当,您的 NEON 版本应该会快得多 - 因此总 能源 消耗不会受到很大影响,例如一半时间的两倍功耗应该对电池功耗产生相同的影响,因为总能量消耗是相同的。看起来您的 NEON 实现需要一些优化工作,因为它并不比您的 C 代码快多少?
  • 它是使用霓虹灯内在函数实现的,我还没有完成汇编编码。相比之下,霓虹灯比 RS 耗电多吗?
  • 您的 NEON 代码一定有严重问题。我会检查拆卸。要么是不正确的实现,要么是编译器搞砸了。也许两者兼而有之。
  • NEON 的问题通常是偶然事件。要么它不是 NEON 能够启动的,要么它比 CPU 版本快一个数量级。就像您的结果一样,没有什么比“快一点”了。你肯定是在 NEON 上做错了什么。
  • @Jake 我正在实现执行卷积操作的边缘检测算法,我的 C 版本在这些 forloops 中使用 2 个 for 循环来执行它,我的代码计算 Xgradient 和 Ygradient(使用 2 个 forloops 来处理 3x3 窗口)。我使用 Neon 内部函数来并行化 X 和 Y 梯度操作。

标签: android c android-ndk neon renderscript


【解决方案1】:

首先,渲染脚本代码的功耗取决于 SOC 的类型、CPU、GPU 运行的频率/电压等。

即使您查看同一供应商的 CPU,例如 ARM,例如 A15s 和 A9s,与 A9 相比,A15s CPU 更耗电。同样,Mali GPU4XX 与 6XX 也表现出相同任务的功耗差异。 此外,不同供应商之间也存在功耗差异,例如 Intel 和 ARM CPU,用于执行相同的任务。同样,人们会注意到 QCOM Adreno GPU 和 ARM Mali GPU 之间的功率差异,即使它们在相同的频率/电压水平下运行。

如果您使用 Nexus 5,我们会得到一个 QUAD A15 CPU,每个 CPU 的速度为 2.3G。 Renderscript 将 CPU 和 GPU 推至最高时钟速度。因此,在此设备上,我希望基于 CPU/Neon 或仅 CPU 的 RS 代码的功耗最高,具体取决于您正在执行的操作类型,然后是 RS GPU 代码。所以归根结底,在功耗方面,您使用的设备类型很重要,因为它们使用的 SOC 不同。在最新一代的 SOC 中,我预计 CPU/Neon 比 GPU 更耗电。

RS 会将 CPU/GPU 时钟频率推至尽可能高的速度。所以我不确定是否可以在这里进行有意义的电源优化。即使他们这样做了,与 CPUS/GPU 以最高速度消耗的功率相比,这些功率节省也是微不足道的。

这种功耗在移动设备上是一个非常大的问题,从功耗角度来看,您可能会使用过滤器在计算成像空间中处理几帧。但是在真正的视频处理中使用渲染脚本的那一刻,即使对于较低的视频分辨率,设备也会很快升温,然后操作系统系统热管理器开始发挥作用。这些热量管理器会降低整体 CPU 速度,从而导致 CPU 渲染脚本的性能不可靠。

对 cme​​ts 的回应

频率本身并不是功耗的原因。它是频率和电压的组合。例如,GPU 在 1.25V 下以 200 Mhz 运行,在 1.25V 下以 550 Mhz 运行可能会消耗相同的功率。根据系统中电源域的设计方式,0.9V 之类的电压对于 200Mhz 应该就足够了,理论上系统应该在频率下降时将 GPU 电源域转换为较低的电压。但是各种 SOC 存在各种问题,因此无法保证一致的电压和频率转换。这可能是 GPU 功率即使在标称负载下也可能很高的原因之一。

因此,无论复杂程度如何,如果您将 GPU 电压保持在 1.25V@600 MHz 之类的值,您的功耗将相当高,与以 2G@1.25V 启动的 CPU 相当...

我测试了 Neon 内在 - 5X5 卷积,与不使用 CPU 执行相同任务相比,它们非常快(3x-5x)。 Neon 硬件通常与 CPU 处于同一电源域(又名 MPU 电源域)。因此,即使在 Neon 硬件工作时,所有 CPU 都保持在电压/频率。由于 Neon 对于给定任务的执行速度比 CPU 快,因此如果它消耗的功率相对于该任务的 CPU 更多,我不会感到惊讶。如果您要获得更快的性能,就必须付出一些代价——这显然是力量。

【讨论】:

  • @mahesh 感谢您的详细回答,我正在使用 Nexus 5 进行测试。所以你的意思是说 CPU 和 Neon 版本比 GPU 版本更耗电。我强烈认为 GPU 以低于 CPU 的时钟频率运行,因此假设 RS 的运行时环境将我们的过滤器移植到 GPU 上,它必须消耗更少的功率。我不确定为什么设备在使用 RS-GPU 时会变热?这和你之前的说法不矛盾吗?我对 Neon Intrinsics 性能的了解较少,所以我想知道 Neon 如何影响功耗,我的经验表明 Neon - 最高 1.49mW
  • @Mahesh 感谢您的详细回复,非常有帮助:)