Metal® Programming Guide Tutorial and Reference via Swift-翻译

Metal®

Programming Guide

Tutorial and Reference via Swift-翻译

这本书是如何组织的

在本书中,我们将讨论Metal编程框架。该框架有两个组件:图形和计算。本书概述了在Metal中创建有用的特定代码实现所需的概念。本书的开头是基础章节,解释了您需要理解的概念,以便与后面的章节一起使用。可以试图直接跳到神经网络的最后章节,但是那些章节假设你已经阅读了大多数之前的章节,如果你没有粗略地理解这些概念,那就没有意义 - 早些时候。
第一部分“金属基础知识”介绍了金属和图形概念的介绍。
第1章,第2章和第3章与您在网站或会议上的入门金属教程中发现的大部分内容相关。在第二部分“渲染和图形”中,您将进入更多特定于图形的库和概念。
第4章到第14章涵盖了特定的金属类,数学和金属着色语言的介绍。其中一些章节适用于图形和数据处理,这将在第三部分“数据并行编程”中讨论。第III部分向您介绍了Metal计算管道。
第15章到第20章详细介绍了Metal计算管道,并概述了GPGPU编程的实际应用。
以下是每章的简要说明。第一部分重点介绍金属图形编程的历史和基础:•第1章“什么是金属?”,概述了金属编程和图形编程的历史。它还解释了本书的范围。•第2章“渲染和栅格图形概述”详细介绍了Metal渲染管道在引擎盖下的工作原理。本章将介绍所有部件如何连接在一起。•第3章,“您的第一个金属应用程序(Hello,Triangle!)”,提供了一个简单的项目,向您介绍使最基本的Metal项目启动和运行所需的所有Metal对象。前言

前言 第二部分介绍了在iPhone上实现3D图形所需的金属渲染管道和概念。
•第4章“图形基本数学”,重新介绍了着色器编程中使用的数学概念。对于没有使用TI-83至少10年的读者来说,本章是一个温和的复习,但它应该对任何人都有用。
•第5章“着色器简介”将指导您实现稍微复杂的着色器。本章将帮助您了解如何将其他语言的算法和着色器适用于您的应用程序。
•第6章“金属资源和内存管理”介绍了MTLResource对象以及它们如何用于内存管理。
•第7章“库,函数和流水线状态”说明了如何由CPU编译和访问金属着色器。
•第8章“2D绘图”比第3章更进一步,并对创建2D应用程序所需的对象进行了更深入的解释。
•第9章“3D绘图简介”概述了3D图形编程概念。
•第10章“高级3D绘图”介绍了如何将这些3D图形概念应用于Metal应用程序。
•第11章“与模型I / O接口”探讨了Apple从Blender和Maya等程序导入3D模型和资产的框架。
•第12章“纹理和采样”介绍如何导入纹理并将其应用于模型对象。
•第13章“多通道渲染技术”详细介绍了如何在不破坏性能的情况下实现计算量更大的渲染技术。
•第14章“释放的几何学:金属中的镶嵌”讨论了如何利用镶嵌来利用不太详细的网格。

第三部分介绍了如何将GPU用于通用计算,特别是图像处理和神经网络。
•第15章“金属计算流水线”,详细介绍了计算编码器与渲染编码器的不同之处以及如何设置数据并行金属应用程序。
•第16章“金属中的图像处理”介绍了一些基本的图像处理概念。
•第17章“机器视觉”以前一章中介绍的创建计算机视觉应用的基础概念为基础。
•第18章“金属性能着色器框架”详细介绍了金属性能着色器框架中存在哪些对象,以实现图像处理和线性代数。
•第19章“神经网络概念”解释了神经网络是什么,并概述了构建神经网络所需的组件。
•第20章“卷积神经网络”教您如何利用金属性能着色器构建卷积神经网络图。
示例代码在整本书中,提供了许多代码示例https://github.com/yuntiaoOS/Metal-Programming-Guide

第一部分:Metal Basics

第1章“什么是金属?”

这是我们的旧模型必须被丢弃和新的现实规则的一点。-Vernor Vinge2014年,Apple为iOS推出了新的低级GPU编程框架:Metal。一年后,Metal来到macOS,其次是watchOS和tvOS。 Apple设备有两个“大脑”,可以编程创建应用程序:中央处理单元(CPU)和图形处理单元(GPU)。 GPU是一种专用处理器,可以非常快速有效地并行执行浮点数学运算。这些任务在CPU上是昂贵的,因为它们不能并行完成,因此已经创建了各种框架和API来将这些昂贵的任务卸载到最适合执行它们的处理器。浮点数学是图形编程不可或缺的一部分,但事实并非如此唯一的应用程序。非图形GPU编程被称为通用GPU(GPGPU)编程。较早的图形范例,例如OpenGL,是在GPGPU编程可行之前开发的。 OpenGL在iPhone的前5年就足够了,但随着它变得越来越强大并且更多的任务成为可能,它也在不断发展。

图形API的历史

三维计算机图形可以追溯到20世纪60年代和70年代。 James Blinn和Edwin Catmull等先驱者的工作为今天的许多创新铺平了道路。但计算机图形学在20世纪80年代和90年代的家庭计算机革命之前并没有普及。在20世纪80年代,编写跨平台软件非常困难,特别是对于游戏。每台计算机和视频游戏系统都有自己专有的硬件和软件驱动程序。每次要在新设备上发布软件时,都必须编写特定于设备的驱动程序,软件和用户界面。这项工作是重复的,在很大程度上是不必要的1981年,Silicon Graphics(SGI)公司成立。它制造了高性能的3D工作站。像所有其他3D工作站制造商一样,它拥有自己专有的3D图形API,称为IRIS GL。它在20世纪80年代的大部分时间里占据了市场主导地位,但到了20世纪90年代初,它的市场份额已经受到侵蚀。 1992年,为了防止市场份额进一步受到侵蚀,它开放了IRIS GL API并将其重命名为OpenGL。直到1997年,OpenGL才成为事实上的3D图形API。由首席程序员John Carmack领导的视频游戏公司idSoftware开发了其最畅销的视频游戏Doom的后续产品。它被称为Quake。每个游戏平台都渴望在其平台上添加Quake端口。 Carmack不希望为市场上的各种硬件和操作系统编写独特的驱动程序,因此他选择OpenGL作为标准。他告诉制造商,如果他们不支持OpenGL,他们就无法将Quake移植到他们的平台上。制造商遵守并编写了支持OpenGL的驱动程序。由于每个制造商都完成了支持OpenGL的工作,许多游戏开发人员开始专门支持OpenGL,因为他们知道它可以在每个平台上运行。瞧!一个行业标准诞生了。2004年,OpenGL 2.0发布。这是OpenGL的重大进步,因为它引入了OpenGL着色语言。这个 C-like

语言允许程序员为GPU编写程序并修改可编程管道的转换和片段着色阶段(见图1.1)。当着色器被添加到OpenGL时,API开始变得相当苛刻。 当OpenGL最初发布时,GPU并不是特别强大。 他们无法处理很多工作。 最初的OpenGL API旨在将尽可能多的工作推送到CPU,因为GPU是一个瓶颈。 当着色器被宣布时,这种限制发生了巨大变化。 GPU越来越强大,执行任务的许多原始方式都非常低效。 随着时间的推移引入了新的方法以适应这种新的现实,但旧的方法从未从API中删除。 有多种方法可以执行相同的任务,有些方法比其他方法更有效。

2003年,OpenGL的精简版本发布:OpenGL ES。 OpenGL ES是OpenGL的一个子集。它删除了所有旧的,苛刻的实现,这些实现不再是向GPU分配工作的最佳方式。它是为嵌入式设备开发的,例如视频游戏控制台和智能手机,但任何用OpenGL ES编写的程序都可以在使用OpenGL的程序上工作,对着色器进行一些小的修改。 2007年,OpenGL ES 2.0发布。此版本包含着色器和可编程管道。也是在2007年,第一款iPhone发布了。第一个iOS SDK中提供的图形框架和API非常有限,但iPhone确实支持OpenGL ES。大多数想要为游戏和应用程序采用复杂图形的开发人员必须在OpenGL ES中编写所有内容。许多拥有多年使用OpenGL经验的程序员能够在SDK处于起步阶段时为iPhone创建复杂的图形。 2010年,Apple开始在iPhone上支持OpenGL ES 2.0以及可编程着色器。多年来,Apple在iPhone上开发了更高级别的图形抽象:Sprite Kit,Scene Kit等。但是如果你想直接编程GPU,你必须使用OpenGL ES。你也被限制为GPU编程图形。您无法将GPU用于通用编程,也无法利用Apple与其他框架紧密集成的硬件/软件。 ​

Metal: 在Apple平台上进行图形处理的新方法

今天,我们口袋里装着超级计算机。 iPhone正在接近我们许多笔记本电脑的计算能力。即使拥有所有这些额外的功能,我们仍然受到OpenGL API的限制。因为OpenGL必须适应GPU和CPU的所有组合和变体,所以它永远无法充分利用Apple对其所有产品的深度集成。 Apple确切地知道它将用于GPU编程的芯片,并且可以优化框架以专门和直接使用该芯片的特性。除了通过控制整个制造链现在可能实现的深度集成之外,OpenGL还存在一些结构性问题,导致它无法实现高效率。计划在每次绘制调用时发生许多昂贵的操作,这些操作不需要。通过改变操作顺序并在绘图调用之外移动昂贵的工作,Metal可以释放更多的处理器带宽。通过让程序员完全控制他们如何使用GPU进行工作,可以进一步释放带宽。

平衡CPU和GPU之间的工作

CPU和GPU工作在偏移量。 CPU为GPU准备命令,然后将它们发送到GPU。虽然GPU正在处理它收到的命令,CPU正在准备下一批命令。在图形编程中,您有责任平衡CPU和GPU之间的工作负载。从CPU到GPU的批处理和发送工作在时间上是昂贵的。发送GPU的工作量越多,花费的时间就越多。在传统的OpenGL应用程序中,很多时候,这种偏移并不是完美平衡的。通常,CPU无法向GPU发送足够的工作以使其在整个帧中保持忙碌,因此GPU处于空闲状态,如图1.2所示。金属增加了这种偏移的效率

GPU可以用于其全部容量。 通过消除在CPU和GPU之间复制内存的需要,可以实现部分提高效率。

复制内存

简书内容字数限制,下面有连接地址

主要是应为Metal的系统性介绍书籍比较少(一般都是英文的)

所以直接用Google翻译直译过来的,英语好的可以帮修改一下,顺便传我一份,谢谢!


链接:https://pan.baidu.com/s/18zReM0HLf3bPRkzzJhZoIw 密码:r3yq

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章