大多数浏览器和
Developer App 均支持流媒体播放。
-
探索 A15 仿生中的 Metal 技术改进
探索如何借助 Metal 技术和 A15 仿生来提升您 app 和游戏的品质。我们会协助您充分利用具有最新 Metal 功能的 AppleGPUFamily8:学习如何使用“有损压缩”节省显存、如何使用“稀疏深度”和“模板纹理”深入研究复杂的阴影贴图技术,以及如何使用“SIMD Shuffle”和“Fill”指令加快图像处理速度。
资源
-
下载
Dave Roberts:大家好! 我是 Dave Roberts 来自 Apple 公司的 GPU 软件团队 很高兴在这里与大家分享 有关新的 Apple A15 仿生芯片中 GPU 的一些最新信息 稍后 GPU 软件团队的另一位同事 Katelyn Hinson 将向您介绍 GPU 的全新 Metal 功能 此外 她还将向大家展示 如何在您的 Metal app 中 使用这些功能 同时也会探索一些精彩的用例 A15 仿生是一个功能强大 面向 Metal app 和游戏的全新平台 它采用了最新的 CPU、GPU 神经网络引擎及其他 有助于改进用户体验的技术 A15 GPU 建立在与 A14 仿生相同的 基于图块的延迟渲染器和 统一内存架构之上 虽然我们也在各个方面做了一些 微架构改进 但我要强调的是 一些重要的 性能变化 A15 GPU 最多可拥有五个着色器核心 在相同的 GPU 核心频率下 第五个核心 可将性能提升 25% 着色器核心现在拥有双倍的 F32 浮点数学单元 可提升 GPU 处理繁重数学工作负载的性能 此外 A15 GPU 还可以提高 用户界面的响应速度 并进一步延长电池续航时间 您无需对代码进行任何修改 就能轻松获得所有这些重大改进 但是 这还不是全部! A15 GPU 采用了一些全新的功能 它们可以让您的 Metal app 变得更加出色 所有这些新功能 都归属于一个新的 Metal 功能集 称为 AppleGPUFamily8 在接下来的探讨中 Katelyn 和我将重点介绍这些新功能 并向大家说明具体有哪些功能 又为什么说它们非常有用 同时还将介绍支持这些功能的 新 Metal API 和着色语言的一些更改 首先来说一说 A15 的全新图形处理功能 有损压缩使用的是 app 的纹理显存 因此对图像质量的影响最小 这一新的 A15 功能可为您提供 与无损压缩相同的 纹理显存带宽节省 我将向大家展示 如何在 Metal app 中使用有损压缩 后面还会提供更多详细信息 稍后 Katelyn 将向大家展示 A15 GPU 如何 通过同时渲染稀疏深度 和模板纹理来扩展 对稀疏纹理的现有支持 Katelyn 还将介绍 一项专门面向计算的新功能: SIMD 组 Shuffle 和 Fill A15 将这些新指令 添加到了 GPU 核心指令集中 Katelyn 会对这个功能进行说明 并向大家展示如何通过减少 图像处理等相关用例的 计算内核执行时间 来提高 app 的性能 首先 让我们来仔细看看有损压缩 为了更好地了解有损压缩 有必要重温一下无损压缩 在 2018 年的 A12 仿生中 首次引入了无损纹理压缩的概念 而 2020 年的 A14 仿生 则对这一功能做出了进一步改进 无损纹理压缩可以节省显存带宽 进而节省电量 这样您的 app 在单次电池充电后 能够完成比从前更多的工作 无损压缩 确保了它始终可以保留纹理细节 事实上 您的 app 可能已经 在利用 A12 仿生 及后续产品中的无损压缩 请前往 developer.apple.com 查看 Tech Talk 中的 “探索 A14 仿生中的 Metal 技术改进” 和“优化纹理数据”文档 了解有关 无损压缩的更多详情 有损压缩将 A15 仿生的 纹理压缩提升到一个 全新的水平 除了无损压缩 所带来的带宽节省之外 有损压缩的显存占用也只有 未压缩纹理的一半 有损压缩会尽可能保持 纹理质量 最重要的是您可以 在 A15 上轻松地 将它应用于渲染目标 以充分利用 由此带来的显存节省 您只需将 纹理描述符的新压缩类型属性 设置为“有损” 就可以启用有损压缩 那么 为什么要使用有损压缩呢? 其实 无论您 选择无损还是有损压缩 都可以节省 大量的纹理显存带宽 压缩单元在纹理数据 写入显存之前对它进行压缩 达到节省带宽的目的 当使用无损压缩时 GPU 必须完美地保留纹理细节 Metal 并不能保证压缩量 因此必须分配足够的显存 来完全容纳未压缩纹理 但是 当使用有损压缩时 纹理的显存占用只有无损压缩的一半 如果 A15 GPU 无法通过无损压缩纹理 在相对减少了 50% 的显存中存储纹理 它就会降低纹理区域的保真度 这就是它的应对方式 有损压缩支持大多数像素格式和纹理类型 而且您可以将它用在自己的渲染目标上 在很多情况下 您可以直接在纹理上启用它 而无需对您的 app 做进一步修改 在任何对质量存在权衡余地的情况下 我都建议您的 app 启用有损压缩 最容易启用有损压缩的地方 其实是您的最终渲染目标 因为这时候最有可能忽视质量下降 不妨考虑对中间渲染目标使用有损压缩 并将节省出的显存用于其他方面 例如提高纹理分辨率 同时 请务必检查您的后处理更改 以找到可能 受益于有损压缩的备选渲染目标 以下是一些详细的用例介绍 看一下我们只为最终渲染目标 启用有损压缩的情况下 所造成的视觉差异 这张分割图像将左侧的无损压缩 与右侧的有损压缩进行了比较 二者的差异非常微妙 这张图像显示了无损压缩与 有损压缩之间的逐像素差异 黑色像素代表无差异 蓝色到绿色代表小的差异 红色则代表最大差异 这张图像中的红色和黄色像素 表示在最终渲染中 具有最大差异的几个孤立区域 如果用 Scooter 软件放大其中一个区域 我很难看到左右图像 之间的任何差异 有损压缩 也适用于中间渲染目标 这是一张水坑反射的并排视图 它比较了无损压缩与有损压缩 如果我再次切换回逐像素差异图 您就会发现有损压缩反射 与无损压缩反射的差异其实很小 此外 您还可以提高纹理的分辨率 以利用有损压缩节省下来的显存 来增加更多细节 例如 这是一张高分辨率反射图 相比无损压缩 在使用相同数量显存的情况下 它可以显示更多细节 本演示的右侧则是对场景中的 每个可渲染纹理使用有损压缩 在运动中场景看起来非常稳定 如果将它与左侧的无损压缩 进行比较您会很难发现差异 Metal 使您可以轻松地 在 app 中使用有损压缩 具体操作如下 首先与往常一样初始化纹理描述符 然后将压缩类型属性设置为“有损” 接着 将存储模式设置为“专用” 最后是创建纹理 现在 您的 app 可以充分利用 有损压缩及其带来的显存节省了 请注意除了少数例外情形 您可以为大多数配置创建有损压缩纹理 比如 您可以对最常见的纹理类型 使用有损压缩 包括 2D、3D、阵列和立方体 但是 这一功能并不支持 某些不太常见的类型 同样地 有损压缩也支持 最常见的像素格式 但不支持 采用密排颜色通道的格式 在 blit 操作中 以及在使用采样和读取操作 访问纹理时 有损压缩支持将纹理作为渲染目标 但是请注意 您无法使用着色器写入操作 来填充有损纹理 有损压缩仅支持 专有存储中的纹理 您不能使用共享或托管存储节点 最后一点 有损纹理 也适用于其他一些常见功能 如 MSAA、sRGB 和 Mip 映射 请前往 developer.apple.com 查看 Metal 功能集表 了解有损压缩支持的更多详情 总而言之 有损压缩在带宽节省上与 无损压缩毫无二致 但同时还节省了 50% 的纹理显存 取决于用例以及您选择 在 app 中使用有损压缩的程度 您可以节省下大量显存 有损压缩的目的是保留纹理细节 但同时只略微降低那些压缩纹理数据 不适合的区域的质量 最后 有损压缩支持 常见的纹理类型、常见的像素格式 以及除着色器写入之外的 所有 GPU 访问模式 让您能够轻松地使用有损压缩 感谢大家收听 接下来有请 Katelyn Katelyn Hinson: 谢谢你 Dave 我很高兴向大家介绍 A15 仿生中的 全新稀疏纹理扩展功能 稀疏纹理是在 Metal 中 管理显存预算的同时 创建高分辨率纹理的一个绝佳方式 A13 仿生中首次引入对稀疏纹理的支持 它允许您在 GPU 时间线上 映射和取消映射 纹理图块 有关如何在 app 中 使用稀疏纹理的更多详情 请参考 2019 年和 2020 年 秋季的 Tech Talk A15 仿生则通过包含深度和模板附件 进一步扩展了对稀疏的支持 稀疏纹理的指导原则是: “不要分配你不会使用的东西” 例如 这个 app 不需要映射 位于 UI 元素后面的图块 借助稀疏深度和模板纹理 这个 app 就可以始终不映射 这些被遮挡的图块 您可以使用稀疏深度附件 来优化阴影贴图 如果您不熟悉阴影贴图 请查看 Metal 的延迟光照示例 它使用的就是这项技术 阴影处理阶段是从灯光的角度 渲染阴影贴图 而光照处理阶段则是将它读回 从阴影贴图中采样到的纹理元素 始终位于投射的视锥体内 这一情形称得上是 稀疏纹理的理想之选 大部分 不需要进行贴图 因为光照处理阶段 不会对这些图块进行采样 以下是一个使用阴影贴图 及其渲染阴影贴图的场景 App 可以收回视锥体外的 图块的显存 因为它不需要 从这些图块中写入或读回 级联阴影贴图是一种更高级的阴影技术 该技术采用了多个单独的阴影贴图 从而能够更有效地覆盖场景 它会在靠近摄像头的地方 分配高分辨率阴影贴图 在远离摄像头的地方 分配低分辨率阴影贴图 例如 这个场景就使用了三个重叠的阴影贴图 每个阴影贴图都具有相同的纹理分辨率 并且离摄像头越远 映射到的区域就越大 阴影贴图中的绿色高亮区域 代表了光照处理阶段所采样的纹理元素 光照处理阶段不均匀地从这些图块中采样 而样品将以热图的形式表示 其中蓝色图块代表欠采样 红色图块代表过采样 您可以利用稀疏图块阴影贴图 将这些纹理替换为能够根据采样率 调节分辨率的单一表面 借助稀疏图块阴影贴图 (STSM) 您可以创建一个稀疏深度表面 该表面不会使用固定分辨率的纹理 而是在稀疏 Mip 贴图链上映射图块 这项技术仅映射 匹配目标采样率所需的图块 这是每个图块在其相对 Mip 级别上的 物理分辨率的图示 您可以通过 跨不同 Mip 映射图块 来自由、高效地调整场景中 阴影贴图的分辨率 以下是 STSM 技术的主要操作步骤 首先 根据采样率生成密度图 接着 根据密度图构建表面和 映射图块 然后 渲染到适应面并从中采样 为了生成密度图 几何处理阶段会为其他处理阶段 填充密度图缓冲区 第一步是获取整个阴影贴图的 采样率 预期样本密度是通过跟踪 渲染几何体的阴影空间导数计算而来的 片段着色器使用原子将导数存储 在 2D 网格中 从而收集整个 shadowUV 空间的采样率 得到密度图后 可利用它来排列稀疏深度纹理的图块 并生成目录缓冲区 光照处理阶段中 会用到这一目录缓冲区 首先 从底部 Mip 开始 通过迭代分割表面 并调度每个 Mip 级别的贴图 来映射深度纹理的图块 为了弄清楚要映射哪些图块 首先通过密度图来检查 当前 Mip 的采样率 在本例中 密度图指示当前 Mip 存在不足 但下一个 Mip 级别较为适合 在这种情况下 您可以通过映射 下一个 Mip 并取消映射当前 Mip 来提升整个图块的品质 下面是另一个更为复杂的场景 密度图指示当前 Mip 至少 满足一个象限的目标 对于下一个 Mip 采样率 和密度图满足两个象限的目标 而其余两个则低于目标采样率 在这种情况下 请映射当前 Mip 中的图块 并映射下一个 Mip 中的一半图块 接着 计算着色器会编写一个 在 UV 和 Mip 级别之间转换的 2D 表 它将存储在我们的目录 (TOC) 缓冲区中 在从 STSM 进行纹理元素采样之前 TOC 缓冲区由光照处理阶段读取 即通过索引表来获取 Mip 之后 当对阴影贴图进行采样时 Mip 将用作显式 LOD 参数 下一步是渲染稀疏阴影贴图 首先 使用 TOC 缓冲区剔除阴影; 然后 对间接绘图命令进行编码 以渲染到稀疏深度纹理 通过使用间接命令缓冲区 分别填充每个 Mip 贴图 以此来渲染表面 ICB 非常适合用于这项任务 因为计算处理阶段可以根据常驻区 以并行方式剔除和排列 各个阴影几何网格 通过根据图块的包容体来测试网格 计算着色器会将绘图命令 编码到单独的 ICB 中 对于横跨阴影贴图的大型对象 着色器会根据每个 Mip 的相关图块 来测试对象 如果至少有一个图块重叠 它就会将绘图命令 编码到 Mip 的 ICB 中 如果 Mip 没有任何重叠的图块 就不会向该 Mip 的 ICB 发出对象绘图命令 每个对象的优化绘图命令集 会由阴影剔除计算处理阶段 执行编码即在并行计算线程中 运行所有相交测试 由于红色网格最靠近摄像头 因此它对阴影贴图上的 11 个图块影响最大 将它与距摄像头最远的橙色网格进行比较 您会发现后者对三个图块的影响最小 一旦完成间接绘图命令 STSM 就可以在 光照处理阶段中执行采样了 下表将 STSM 与阴影贴图 和级联阴影贴图进行了比较 STSM 采样率和有效性 与单个阴影贴图大致相同 但使用的显存要少得多 事实上 在相同的分辨率下 它的显存占用 只有不到百分之一 我希望本次的深入探讨可以为您提供一些 有关如何在 Metal app 中 利用稀疏图块阴影贴图 来创建高效、高品质阴影的思路 最后 我很高兴能够向大家介绍 A15 中 新增的 Metal 计算功能: SIMD Shuffle 和 Fill 在现代图像处理中 卷积核被应用于边缘检测 模糊和锐化等滤波器 以下是一个应用于现代渲染演示中的 图像的卷积 类似这样的工作负载通常受到 纹理采样或从线程组显存中读取的限制 导致 GPU 的数学单元得不到充分利用 Apple 芯片提供了 一组丰富的 SIMD 指令 它们可用在 Metal 计算着色器中 旨在帮助优化这些工作负载 由于 SIMD 组的线程 是以锁步方式并发运行的 因此 SIMD 组函数会利用这种锁步执行 在它的线程之间共享数据 有关现有 SIMD 函数的更多信息 请参阅有关 A13 仿生 和 A14 仿生的 Tech Talk 里面对相关内容进行了介绍 现在让我们来讨论一下新的 SIMD 指令 A15 仿生中新增了 对 SIMD及 Quad Shuffle 和 Fill 的支持 这些指令旨在 改进滑动窗口图像操作 就像之前所示的边缘检测卷积一样 这些函数将通过在给定 SIMD 组中的 相邻线程之间共享数据 (而非使用显存) 来优化计算工作负载 首先让我们来看一看 Quad Shuffle Down 它最早是在 A13 中得到支持 数据缓冲区中包含目录 A、B、C 和 D 它们被加载到 Quad 线程的寄存器中 分别为:0、1、2 和 3 当以位移 1 应用 Shuffle Down 时 线程 0、1 和 2 中的寄存器数据 就会从线程 1、2 和 3 中获取数据 由于计算出的 Quad 通道 ID 不会回绕 因此结果中的线程 3 便具有未移位的值 D 相反 如果使用 Quad Shuffle 和 Fill Down 指令 则会提供一个 Fill 缓冲区 来更新结果中的线程 3 现在 线程 0 的 Fill 数据 被混到线程 3 的 输出数据中 同样 对于位移为 2 的 Quad Shuffle Up 和 Fill 我们会看到 A 和 B 被混到 线程 2 和线程 3 并且 Fill 缓冲区中的数据 被混到输出的下部通道中 在 Apple 芯片上 SIMD 组 由 32 个线程组成 在 SIMD 通道中可以应用相同的 Shuffle 和 Fill 行为 其中下部的增量通道是 用 Fill 数据的上部通道来填充的 新的 SIMD 及 Quad Shuffle 和 Fill 指令 还有一个可选的模参数 它允许用户指定矢量宽度 对于有 8 个线程的模块 SIMD 组被有效地拆分为四个矢量 数据缓冲值 首先被 Shuffle Up 为两个索引 而 Fill 数据则被混到 每组八个线程中 让我们示范一下使用这些新指令 其中 我们可以使用 SIMD Shuffle 和 Fill 来优化用于现代渲染图像 边缘检测的内核 为了生成最终结果 不妨将一个 5×5 的卷积核应用于 输入图像 输出图像被拆分成若干 SIMD 组 其中的每个 SIMD 组 是一个 4×8 的区块 而每个线程则分别写入到一个输出中 让我们将侧重点放在 为单个 SIMD 组生成输出上 对于 5×5 的卷积 每个线程必须从输入中读取 5×5 的像素 对于每个 4×8 的 SIMD 组 必须在计算着色器中 对一个 8×12 的区域进行采样 这种卷积的简单实现 需要每个输出线程有 25 个样本 这就导致 SIMD 组存在很大的重叠 您可以通过 Shuffle 和 Fill 指令 对此进行优化 从而消除 SIMD 组内的重复样本 并通过寄存器混洗来共享数据 让我们来看一看为什么需要从这些位置读取数据 首先加载 A 这是一个 4×8 的窗口 其中 SIMD 组中的 每个线程对单个像素进行采样 然后加载 B 这是右上角的窗口 然后加载 C 这是左下角的窗口 最后加载 D 这是右下角的窗口 红色的轮廓矩形表示输出图像的 SIMD 组的目标区域 通过每个线程的四个样本 一个 8×12 的输入区域 被加载到 SIMD 组中 而且没有任何重叠的样本 让我们再次将注意力转回到 线程 0 的 5×5 区域 这些样本可以表示为一个 5×5 的邻域 Quad Shuffle 和 Fill Down可用于 访问第一行邻域 即首先对 A 的数据进行 Shuffle Down 并填充 B 的数据 然后 将上一行的 32 位宽矢量 Shuffle Down 到下一行 由于数据进行了整行 Shuffle Down 因此需要一个 Fill 矢量 来混洗 32 位宽矢量 上部通道中的 C 和 D 的样本 通过相同的方法可以使用 SIMD 和 Quad Shuffle Down 来获取 5×5 区域中的剩余样本 一旦整个邻域被混洗 这些样本就会被用作 边缘检测算法的输入 虽然简单实现是对每个线程的 整个邻域进行采样 但借助新的 SIMD 和 Quad Shuffle 和 Fill 指令 每个 SIMD 组的样本数量 都减少了 84% 从而消除了相邻线程之间的重叠样本 利用新的 SIMD 指令 许多常见的图像处理 和机器学习算法都可以 通过相同的方法 来优化跨 SIMD 组的数据共享 这就是SIMD Shuffle 和 Fill 让我们来复习一下所学的内容 有损压缩是一项十分简单易用的功能 它可以在保持纹理质量的同时 节省显存占用和带宽 稀疏深度和模板纹理 可以帮助您创建高效、高质量的阴影贴图 新的计算指令 SIMD Shuffle 和 Fill 减少了样本的重叠并改进了 机器学习和图像处理 app 的 滑动窗口图像操作 最后 得益于 A15 仿生 GPU 的 整体架构改进 所有 Metal app 在性能、响应能力和节能方面 都得到了额外提升 感谢您的观看
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。