我使用Android NDK(使用Renderscript的C ++ API)开发了3个C / RS / Neon-Intrinsics版本的视频处理算法。从JAVA前端到NDK端的C / RS / Neon调用将达到本机级别。我发现由于某些原因,霓虹灯版本比C和RS版本要消耗很多功率。我在电源测试中使用了[[Trepn 5.0。
Renderscript API是否专注于功耗优化?
即使您查看来自同一供应商的CPU,例如说A15和A9,也都是ARM,与A9相比,A15的CPU更加耗电。同样,Mali GPU4XX与6XX的相同任务也表现出功耗差异。此外,在执行相同任务的不同供应商(例如Intel和ARM CPU)之间也存在功耗差异。同样,即使它们以相同的频率/电压水平运行,也会注意到QCOM Adreno GPU与ARM Mali GPU之间的功率差异。
[如果您使用的是Nexus 5,我们会以每CPU 2.3G的速度启动QUAD A15 CPU。 Renderscript将CPU和GPU推向最高时钟速度。因此,在此设备上,我希望基于CPU / Neon或仅基于CPU的RS代码的功耗最高,具体取决于您正在执行的操作类型,然后是RS GPU代码。因此,关于功耗,最重要的是,由于所使用的SOC有所不同,因此所用设备的类型至关重要。在目前出现的最新一代SOC中,我期望CPU / Neon的功耗比GPU高。
RS会将CPU / GPU时钟频率推至最高速度。因此,我不确定是否可以在这里进行有意义的功耗优化。即使这样做,与CPUS / GPU最高速度所消耗的功率相比,这些功率节省也是微不足道的。
此功耗在移动设备上是一个巨大的问题,从功耗的角度来看,使用过滤器在计算成像空间中处理几帧可能会很好。但是,即使在真正的视频处理中执行渲染脚本的那一刻,即使对于较低的视频分辨率,设备也会如此迅速地变热,然后OS系统热管理器开始发挥作用。这些热量管理器会降低总体CPU速度,从而导致CPU渲染脚本的性能不可靠。
回复评论
仅频率不是功耗的原因。它是频率和电压的组合。例如,以1.25V的200 Mhz和1.25V的550 Mhz运行的GPU可能会消耗相同的功率。根据系统中电源域的设计方式,对于200Mhz,0.9V之类的电压就足够了,理论上,当频率降低时,系统应该将GPU电源域转换为较低的电压。但是各种SOC都有各种问题,因此不能保证一致的电压和频率转换。这可能是为什么即使在标称负载下GPU功率仍会很高的原因之一。
因此,无论复杂程度如何,如果您将GPU电压保持在1.25V@600 MHz之类的水平,您的功耗将非常高,可与2G@1.25V的CPU功耗相提并论...
我测试了Neon内在函数-5X5进行了卷积运算,与不使用CPU来完成同一任务相比,它们相当快(3x-5x)。霓虹灯硬件通常与CPU在同一电源域(也称为MPU电源域)中。因此,即使Neon硬件正在工作,所有CPU仍保持电压/频率。由于Neon在给定任务上的执行速度比CPU快,因此,如果它相对于该任务消耗的功率大于CPU,我不会感到惊讶。如果要获得更快的性能,就必须付出一些努力-它显然是强大的功能。