【译】Vulkan:高效的手机
发表于2016-03-11
Vulkan:高效的手机
欢迎来到我们关于Vulkan规范系列博客的第二篇文章!这一次我将通过对效率的特别关注来描述Vulkan对于手机和嵌入式系统如此重要的原因所在。
Vulkan的主要目的之一就是要确保一个更加高效的应用程序界面。开放图形语言ES需要将大量的努力放在驱动程序上以此来确保其能够工作,同时这也意味着CPU很容易成为图形应用中的一个障碍。
GPUs等待着CPU?
在图形应用程序界面领域中,拥有高性能CPU的其中一个最刺耳明显的影响就是由CPU自身所局限的应用。众所周知的是各类CPU都有一个最大吞吐量,并且特别是对于手机来讲,它并不算太高。我们一直在讨论设计一个GPU程序,以此来取代纹理填充率以及三角形生成率等,其中一个最寻常的图形障碍是由一个不相关的处理程序造成的。
我们的Gnome Horde样本中前12秒仅仅显示出这种东西是多么的糟糕--我们正在推动Vulkan和开放图形语言ES相同的描绘指令,通过将任何一方作为独立的描绘指令(Vulkan在左,OpenGL ES在右):
OpenGL ES通过它所能进行的缩小功能的描绘次数来严格限制,并且它也真正展示了这个功能:它在最大程度上降低了6FPS!
Vulkan的救援
随着Vulkan逐渐增强的效率,它会在每帧上推出更多的描绘——相比较CPU而言,你将更有可能是被一些GPU方面的东西所困扰。写的很好的应用程序将会在每次描绘时,分批次处理更多的工作,以此来防止由此带来的更糟糕的影响——而是维持这种微妙的平衡现象,而且并不是每一个应用程序都写的很棒。
然而,这是一个性能方面的问题,并且这个标杆是为了支持高效。但是这阐述了重要的一点,即使是当一个应用程序不能克服这个障碍,任何一个绘图调用仍然在做着无用功——很明显这并不是免费的。这个Gnome Horde样本也仅仅是使得这种弊端以一种明显的方式显现出来的一种尝试,但是这个问题仍然渗透在所有的OpenGL ES程序中。
在我继续接下来的文章之前,指出下面这种问题是有必要的:在流行的操作系统(OS)上的任何东西都在某种程度上使用了图形编程接口APIs。很大程度上来讲,通过软件渲染的用户界面已经一去不返了——你在屏幕上看到的大部分东西都是由GPU通过API的应用:比如OpenGL ES或者是DirectX来实现的。这反过来意味着核心操作系统甚至也受这些问题的影响。
片上系统的热预算
对于一个台式电脑来说,处于密封金属盒里的CPU或者是GPU与你有很近的距离——如果其中一个处理器太热,风扇就会呼呼地转动以此对环境进行散热。如果一个手机处理器太热,它甚至会烫伤你——通常在模具和任何持有设备之间只有一个很薄的壳体。让其温度保持较低是非常重要的。
导致处理器产生热量的原因是其处于工作状态中。每个处理器的操作都会产生一些热量,并且每秒钟操作的的越多,它就会越热。减少它的工作量当然意味着更少热量的产生,所以典型的方法来保持手机中一个芯片的冷却就是在给定的时间内限制它的工作量。如果可以用更少的花费做更多的工作——当然更好。
在这里需要指出,同样重要的是移动设备通常使用一个系统芯片(片上系统),这意味着每个处理器都在同一个芯片上。它的含义是,从一个处理器上产生的热量与从任何其它的处理器上产生的热量是没有区别的——如果模具过热,整个芯片都可能要去做无意义的抵消。
Vulkan比起过去的API,减少了对GPU发出指令所必需的工作总量,并且事实上也意味着CPU运行时的温度会比之前的低一些。即使环绕着的主屏幕的操作系统是使用GPU来描绘在屏幕上——所以除非你的手机屏幕是关着的,使用Vulkan的桌面来绘制窗口部件可以避免明显的发热。
对片上系统这一平台有着积极作用的一方面是通过运行的CPU散热器,它实际上允许了GPU被推到更加困难的地步,同时实现了在能够拥有更多中央处理器的API基础上,提升GPU性能。
电源和电池寿命
与之相关但又独立于热预算的是电池的寿命。正如每个处理器的操作会产生热量,它也需要电流来使其运行。移动设备被两件事情所限制,电源——有多少电源是可以提供给芯片的部件,以及可能更加重要的——电池容量。
片上系统只有那么多空间来铺设电源线,并且随着越来越多的处理器被挤在不断缩小的芯片上,空间绝对是非常珍贵的。
电池通常在任何移动设备上都是最大的组成部分之一,它仅次于屏幕和外壳。电池的寿命对于销售任何移动设备过程都是一个关键因素,也是一个好的应用体验的关键。如果把愤怒的小鸟运行了5秒然后电池就没电了,这款游戏是没有人玩的。
Vulkan效率的提高可以降低移动设备对电流需求。当它逐渐被更好的应用,并且更多的应用程序和操作系统转而使用专用的Vulkan时,它的效果就会变得非常明显,并且设备的电池寿命也会因此提升。
Vulkan如何达到更好的效率
Vulkan并不是灵丹妙药。将应用程序移植到Vulkan上是完全可能的并且它会比使用早期的API时运行的更慢!Vulkan只是有更好的效率上的潜力——但是它需要应用程序来真正考量API的用途,并且了解它们在做什么。多年来使用OpenGL ES来移植东西是非常困难的,因为API典型的使用模式是不同的。当今的OpenGL ES驱动隐含了许多别的必需的成本(例如对象修补/缓存)。
但是,如果你愿意换费时间用自己的方式去学习一个新的API,并且真正考虑了你正在做什么——将会有许多好处。再一次地,我希望你能参考侏儒部落(一款演示demo)。
验证和错误
第一个相对简单的事就是Vulkan除去过载几乎没有运行时错误检测。如果一个应用程序出错,驱动程序不会捕获它,它可能会运行到任何步骤包括程序终止。
这个似乎是苛刻的——但是反正没人会真正去检查错误的开发以及调试,所以当你实际使用应用程序时,虽然它运行表现很像是过载,但是验证的是没有任何作用的东西。相反,Vulkan计划使用工具和图层以使得在它对消费设备起作用之前就能够找到它们。
危险跟踪和同步
OpenGL ES进行了大量的应用程序资源使用和同步式跟踪,具备明确管理的只有最近的版本中通过栅栏同步对象,查询以及内存屏障。即使有了这些外显式的操作——很多操作仍然在后台进行,并且这对于一个驱动程序来说是非常昂贵的。由于OpenGL ES必须对所有的应用程序进行一般性管理,故而它往往是过于保守(更贵)或者需要复杂的算法来确定一个更好的路径。
Vulkan实现它完全由应用程序开发人员来决定如何执行,以怎样的顺序来执行,以及如何利用资源管理。应用程序倾向于,更好的了解它们如何计划使用资源和同步的工作,比起通用的驱动程序,这使得更低开销成为一个可能。
管线状态对象
改变任何一种状态都是一项昂贵的操作,更糟糕的是,事实上许多国家都可能需要修改着色代码。例如,由于PowerVR GPU支持可编程混合,我们必须将混合状态的片段进行着色,这已经不是什么秘密可言的。其他的GPU厂商也在其他方面明显的固定功能状态上面临着相似的问题。甚至那些没能直接作用在着色程序的国家都可能需要通过其他的方式编译或者翻译。
Vulkan指出,应用程序应该能够提前于绘制时间提供大部分大部分信息,并将之融入到管线状态对象(PSOs)之外的主要渲染循环内。PSOs在绘制命令生成的过程中负责那些可能显著缩减CPU工作的事情,为他们处理这个API状态下的GPU代码中所有的验证,编写以及翻译。
重复利用命令缓冲
Vulkan的命令提交模型要求首先调用绘制来生成命令缓冲区,然后提交。对比类似的OpenGL ES,这个模型在绘制命令时是立即有效地执行。
命令缓冲区是专门以Vulkan为对象,并且一旦他们提交并且不去删除它——让他们重新多次使用。命令的生成仍然是Vulkan中最大的费用,所以降低费用的最佳途径是通过重新使用的已创建的缓冲区来避免这种情况。
在没有被GPU使用时,由命令缓冲区引用的资源可以被修改,这样可以使得命令缓存区有充足的容量。作为一个相当基本的范例,我们的演示库相对于整个场景仅仅使用2个命令缓冲区,并且那是不能够再生的。从一个场景到一个场景,镜头的转换和渐隐值通过命令缓冲区重新引用的统一数据存储,进行简单的更新。有两个命令缓冲区的唯一原因就是它可以由GPU进行渲染,而其它的相一致的缓冲区是由CPU进行更新的。
随着越来越多的应用成为数据驱动,以及越来越多的工作可以由GPU来指定,几乎一个应用中的所有命令缓存区都将是潜在的可以被多次进行重复使用的。
多线程
在一个较低频率或者一个较小工作量的多内核运行中,通常会运行冷却器,并且会比你通过单核和混合来完成的所有工作消耗更小的功率。通过建立更多更好的多线程,Vulkan使得应用程序更加广泛地传播他们的工作量并且从中获益——再一次的实现芯片冷却以及低功耗。我会在下一个作品,即“Vulkan:扩展到多线程”中多谈论一下多线程如何作用的,但是,在这里值得一提的是,它对于效率确实有影响。
GPU的效率
这个部分才真正谈CPU的效率,但是Vulkan实际上确实提供了一些GPU效率上的支持。在本系列的最后一部分:“Vulkan——积极架构:Vulkan API是怎样为PowerVR GPU工作的”将会进一步详细的介绍各部分的API,并且比起上一代的API,这也会给我们更好的性能和效率体验。
结论
Vulkan是一种高效的API,并且比起以前的graphics API,它会使应用程序功耗更小,产生的热量更少。在某种程度上来说,几乎所有在移动设备上的应用程序都使用graphics,甚至于在屏幕上绘制的用户界面也有使用,包括许多情况下作用在操作系统本身上——因此对于移动设备来说这是潜在的巨大胜利。
因为确实有这样一个广泛存在的潜在的影响,消费者可以去期望提升电池寿命并且比起现在他们已经有的这样一个增长的上部空间,应用程序可以做得更多。从长远来看,这可以帮助改变功耗的平衡并足以潜移默化的影响硬件的设计,包括像制造物联网设备以及可穿戴设备或许更加实用。
唯一的缺点是,在那些寒冷冬天的夜晚,你的手机将不再是相当有效的暖宝宝了。
来自PowerVR 团队的最新的新闻和公告记得还是紧跟我们的Twitter。
如果你想了解更多关于Vulkan的知识,记录我们即将举行的四个研讨会:
高效的手机
缩放到多线程
显示操作和一致的帧次数
积极架构:Vulkan API是如何为PowerVR GPU工作的
如果你错过了,也看看我最后一个博客为所有平台发布的一个接口。
翻译自【http://blog.imgtec.com/powervr/vulkan-high-efficiency-on-mobile】
原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权