在上一篇文章《什么是GPU?GPU有什么用?》曾提及可编程着色器,可编程着色器对于 3D 游戏的设计者来说可谓有巨大的优点,不过同时也给 GPU 工程师带来了一些和 CPU 类似的有趣的问题。因需要发送指令(instruction)运行,解码(decode)和执行指令(execute)过程必不可少,而着色器代码中判断语句和循环语句也会引起执行次序的小问题等等。这意味着着色器核心已经能成为一个小型的计算引擎去执行任何的编程任务,尽管不如 CPU 那么灵活多变,但也能执行有用的、非图形相关的任务。
本文引用地址:/zixunimg/eepwimg/www.eepw.com.cn/article/201710/366418.htmGPU 计算
而现在利用 GPU 计算的任务基本都是高度并行的——同时执行大量小型的数学计算,所以当前其发展方向是机器学习(machine learning)和计算机视觉(computer vision)。随着 GPU 计算扩展的领域越来越大,作用也会随着越发重要,它就能成为和 CPU 并排的伙伴而不再是 CPU 附属的一个部件。
在 2015 年 10 月 ARM 发布最新的 SoC 时顺带还有 CoreLink CCI-550,它的作用就是将 CPU、GPU、主存储器和各种内存缓冲区连接在一起。新的 GPU 代号为 Mimir,能够从高速缓存内存里直接获取数据,甚至在 CPU 执行变动时,GPU 无需通过主存储器就能获得和 CPU 一样的数据。CCI-550 也允许 CPU 和 GPU 共享相同的内存,无需在 CPU 和 GPU 的缓冲区之间复制数据。
统一着色器(Unified shaders)和 Vulkan
OpenGL ES 3.0(或相近的 DirectX 版本) 对比 OpenGL ES 2.0 最大的变化就是统一着色器。查看 Mali-470 的模型图,就能发现兼容 OpenGL ES 2.0 的 GPU 有两种类型的着色器,分别称作“顶点(Vertex Processor)”和“片段(Fragment Processor)”,就是之前介绍过的顶点着色器和片段着色器。Mali-470 有 1 个顶点着色器和 4 个片段着色器,而查看 Mali-T860 的模型图就会发现它支持 16 个能作为顶点着色器或片段着色器的统一着色器,此前着色器可能会空闲的情况被消除了。
2016 年 2 月发布的 3D 图形 API——Vulkan 是另一个重点,它带来了两个重要的创新。一是通过降低驱动程序的消耗和提高 CPU 多线程使用率,带来显着的性能提升;二是为桌面系统、移动系统和控制台提供了一个统一的 API。Vulkan 现支持 Windows 7/8/10、SteamOS、Android 和部分 Linux 发行版,首款支持 Vulkan 的 Android 机器是三星的 Galaxy S7。
电源问题
不同于 PC 上的显卡,它们拥有大的风扇、复杂的冷却系统,部分有需要的还会直接供电,智能手机和平板上的 GPU 体积无法和这些显卡相比。加上智能手机的 GPU 由电池供电,所以与桌面级的显卡相比,这些移动版的 GPU 不能大量的消耗能源,更要控制热量的散发。然而作为消费者的我们肯定是希望它能有更强的图形性能,所以对于移动版 GPU 工程师来说,最大的挑战不是支持最新的 3D API,而是更高的图形性能与发热、能耗之间如何达到一个平衡。
总结
回顾一下这次两篇文章的重点:移动 3D 图形基于三角形,模型进行移动、缩放是对三角形的顶点进行处理;GPU 里面的可编程执行单元被称为着色器核心,游戏开发者可以编写基于着色器核心的代码;顶点着色器处理完后,交由片段着色器转换为一个个像素,最终送到像素着色器设置颜色;3D 游戏开发者可以根据需要编程自由调用顶点着色器和片段着色器;GPU 并行处理的特性让其非常适合用于机器学习和计算机视觉。