高级 API 性能:着色器

着色器通过使您能够控制渲染过程的各个方面,在图形编程中发挥着关键作用。它们在 GPU 上运行,负责操作顶点、像素和其他数据。

  • 常规着色器
  • 计算着色器
  • 像素渲染
  • 顶点着色器
  • 几何体、域和外壳着色器

常规着色器

这些提示适用于所有类型的着色器。

推荐

  • 避免扭曲发散常量缓冲区视图(CBV)和即时常量缓冲区(ICB)读取。
    • 当扭曲中的线程统一访问数据时,恒定缓冲区读取最有效。如果需要发散读取,请使用着色器资源视图(SRV)。
    • SRV 应优先于 CBV 的典型情况包括:
      • 骨骼或蒙皮数据
      • 查找表,如预先计算的随机数
  • 要优化缓冲区和组共享内存,请使用手动位打包。在创建用于打包数据的结构时,请考虑字段可以容纳的值的范围,并选择可以包含该范围的最小数据类型。
  • 通过提供预期运行时行为的提示来优化控制流。
    • 确保启用编译标志-为 DXC 绑定的所有资源(或 D3DCOMPILE_all_resources_bound 在 FXC)如果可能的话。这样可以实现一组更大的驱动程序端优化。
    • 考虑在适当的情况下使用 FLATEN 和 BRANCH 关键字。
      • 条件分支可能会阻止编译器提升长延迟指令,例如纹理获取。
      • FLATTEN 关键字提示编译器可以在对语句求值之前自由地提升和启动加载操作。
  • 使用根签名 1.1 指定静态数据和描述符,使驱动程序能够进行最佳着色器优化。
  • 尽量减少寄存器的使用。寄存器分配可能会限制占用率,并可能迫使驱动程序将寄存器溢出到内存中。
  • 加载单通道纹理四边形时,首选使用聚集指令。
    • 与由连续样本指令构建的等效操作相比,这将使预期延迟减少近 4 倍。
  • 比起原始缓冲区,更喜欢结构化缓冲区。
    • 结构化缓冲区具有更严格的对齐要求,这使驱动器能够调度更高效的加载指令。
  • 考虑在数学密集型着色器(例如,物理模拟和去噪器)中使用超越函数(exp、log、sin、cos、sqrt)的数值近似或预计算查找表。
  • 为了在 TEX 单元中促进快速路径,最高可加速 2 倍,在某些情况下使用点过滤:
    • 点过滤已经是精确表示的低分辨率纹理。
    • 正在以其本机分辨率访问的纹理。

不推荐

  • 不要认为半精度浮点运算总是比全精度浮点运算快,反之亦然。
    • 在 NVIDIA Ampere GPU 上,执行 FP32 和执行 FP16 指令一样高效。在精确格式之间转换的开销可能会以净损失告终。
    • NVIDIA Turing GPU 可能受益于使用 FP16 数学,因为 FP16 的发布速率是 FP32 的两倍。

计算着色器

计算着色器用于从数据处理和模拟到机器学习的通用计算。

推荐

  • 如果可能进行跨线程通信,请考虑在组共享内存上使用 wave 内部函数。
    • Wave 内部函数不需要显式的线程同步。
    • 从 SM 6.0 开始,HLSL 本机支持 warp wide wave intrinsic,而无需使用特定于供应商的 HLSL 扩展。只有在缺少预期功能时,才考虑使用特定于供应商的 API。有关详细信息,请参阅 在 HLSL 中解锁 GPU Intrinsics。
    • 要增加原子吞吐量,请使用 wave 指令跨扭曲合并原子操作。
  • 为了最大化缓存位置并提高 L1 和 L2 命中率,请尝试对全屏计算过程进行线程组 ID 刷新。
  • 一个好的起点是以对应于两到八次翘曲的线组大小为目标。例如,全屏通道的线程组大小为 8x8x1 或 16x16x1。确保对着色器进行评测,并根据评测结果调整尺寸。

不推荐

  • 不要使线程组的大小难以按平台和 GPU 架构进行缩放。
    • 专业化常数可以在 Vulkan 中用于在管道创建时设置维度,而 HLSL 要求在着色器编译时知道线程组大小。
  • 注意线程组启动延迟。
    • 如果您的 CS 具有在大多数情况下预计会提前退出的提前退出条件,则最好选择更大的线程组维度,并减少启动的线程组总数。

像素渲染

像素着色器,也称为片段着色器,用于按像素计算效果。

推荐

  • 与像素着色器中的手动深度测试相比,更喜欢使用深度边界测试或模具和深度测试。
  • 深度和模板测试可能会丢弃整个 16×16 光栅瓦片,直至单个像素。确保 Early-Z 已启用。
  • 注意可能迫使驾驶员禁用 Early-Z 测试的使用模式:
    • 有条件的 z 写入,如剪辑和丢弃
      • 另一种选择是考虑使用 null 混合操作
    • 像素着色器深度写入
    • 写入无人机资源
  • 如果扭曲之间的延迟差异很大,请考虑将全屏过程转换为计算着色器。

不推荐

  • 不要广泛使用光栅顺序视图(ROV)技术。
    • 保证订单不是免费的。
    • 始终与高级混合操作和原子学等替代方法进行比较。

顶点着色器

顶点着色器用于在逐顶点的基础上计算效果。

推荐

  • 更喜欢使用压缩顶点格式。
  • 与 CBV 相比,更倾向于使用 SRV 对数据进行蒙皮。这是 CBV 读数不同的典型情况。

几何体、域和外壳着色器

几何体、域和外壳着色器用于控制、评估和生成几何体,从而使镶嵌能够创建曲面和对象的动态生成。

推荐

  • 使用 NVIDIA Turing 中引入的网格着色功能替换几何体、域和外壳着色器。
  • 使用以下配置启用快速几何体路径:
    • 固定拓扑:扩展或减少顶点数量。
    • 固定基元类型:输入基元类型等于输出基元类型。
    • 不可变的逐顶点属性:应用程序无法更改顶点属性,只能将它们从输入复制到输出。
    • 每基元属性可变:应用程序可以为整个基元计算一个值,然后将其传递到片段着色器阶段。例如,它可以计算三角形的面积。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/141495.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

细说STM32单片机使用通用定时器生成固定占空比和可变占空比PWM波的方法

目录 一、本实例测试的目的 二、硬件和CubeMX项目配置 1、硬件开发板 2、项目配置 (1)定时器TIM2_CH1 (2)时钟和Debug (3) NVIC (4)GPIO 3、输出固定占空比的PWM波源码 &…

docker进入容器运行命令详细讲解

​ 大家好,我是程序员小羊! 前言: 在 Docker 中,进入容器并运行命令是常见的操作,尤其是当你想要调试、检查日志或手动运行某些程序时。Docker 提供了几种方式来进入容器和执行命令。 前提条件 确保你的 Docker 容器…

Vulnhub:BlueSky

靶机下载地址 信息收集 主机发现 nmap扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip:192.168.31.171。 端口扫描 nmap 192.168.31.171 -A -p- -T4 开放端口22,8080。 目录扫描 访问8080端口,如图,是tomcat管理页面…

unity3d入门教程七

unity3d入门教程七 17.1物理系统17.2静态刚体17.3刚体的碰撞17.4刚体的反弹18.1运动学刚体18.2碰撞检测18.3碰撞事件回调18.4目标的识别18.5碰撞的规避 17.1物理系统 在物理系统中的物体具有质量和速度的是刚体 不用写代码就会自由落体运动了 17.2静态刚体 给 ‘地面’ 添…

学习笔记JVM篇(四)

垃圾回收器 说完垃圾回收算法接下来就需要对应的垃圾回收器去回垃圾回收器。接下来介绍几种垃圾回收器 1、Serial 串行回收器,是单线程版本,暂停所有的应用。在单CPU的情况下效率是很高的,因为不涉及线程的上下文切换。适用于小型程序和客…

【C语言】分支和循环(下)

分支和循环(下) 5、练习:判断年份是否为闰年6、短路7、switch语句7.1 if语句和switch语句的对比7.2switch语句中的break语句7.3switch语句中的default7.4 switch语句中的case和default的顺序问题 8、while循环8.1 if和while的对比8.2 while语…

C++_20_多态

多继承会造成 菱形继承** 使用虚继承来解决 不是给爷爷类加 也不是给子类加 是给父类加 虚基指针和虚基表 多态 概念: 概念: 一个事物的多种形态,简称多态 如: 对象的多态 ​ 张三 ​ 在对象面前 怂 ​ 在朋友面前 谄媚 ​ 在父…

搜索二叉树BSTree的原理及实现

目录 一、简介 二、功能的实现 节点的实现 这里为什么模板参数采用的是K而不是T呢? 树体的实现 非递归版本 Insert函数 Find函数 Erase函数 递归版本 中序遍历 FindR InsertR EraseR 构造函数 析构函数 拷贝构造 赋值重载 一、简介 BSTree&#x…

【CS110L】Rust语言 Lecture3-4 笔记

文章目录 第三讲 所有权:移动与借用&例1例2例3 错误处理(开头)为什么空指针如此危险,我们能做什么以应对?— 引出Optionis_none()函数unwrap_or()函数常见用法 第四讲 代码实践:链表Box节点和链表的定义节点和链表的构造函数判…

Hack the 21LTR: Scene 1 靶机

靶机配置 kali配置 虚拟网络适配器配置 不行的时候关闭虚拟机,多点几次生成 主机发现和端口扫描 主机发现 arp-scan -l 端口扫描 端口扫描发现21,22,80端口开放 nmap -sV -A -T4 192.168.2.120 访问80端口 http://192.168.2.120/ 查看页…

SOMEIP_ETS_108: SD_Deregister_from_Eventgroup

测试目的: 验证DUT在接收到StopSubscribeEventgroup消息并取消订阅后,不会响应TestEventUINT8触发的事件。 描述 本测试用例旨在确保DUT在取消对事件组的订阅后,不会对随后的事件触发做出响应。 测试拓扑: 具体步骤&#xff1…

.NET内网实战:通过命令行解密Web.config

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,对内网和后渗透感兴趣的朋友们可以订阅该电子报刊,解锁更多的报刊内容。 02基本介绍 本文内容部分节选自小报童…

Spring Boot集成Akka Cluster快速入门Demo

1.什么是Akka Cluster? Akka Cluster将多个JVM连接整合在一起,实现消息地址的透明化和统一化使用管理,集成一体化的消息驱动系统。最终目的是将一个大型程序分割成若干子程序,部署到很多JVM上去实现程序的分布式并行运算&#xf…

编译原理之预处理

目录 生成预处理文件的的命令 预处理做了什么 实验 --------------------------------------------------------------------------------------------------------------------------------- 本篇文章主要是带着大家一起看看预处理阶段编译器都做了些什么 --------------…

十四,在Spring Boot当中对应“ Tomcat 服务器的相关配置”和“服务器的切换”的详细说明

十四,在Spring Boot当中对应“ Tomcat 服务器的相关配置”和“服务器的切换”的详细说明 文章目录 十四,在Spring Boot当中对应“ Tomcat 服务器的相关配置”和“服务器的切换”的详细说明1. 基本介绍2. 准备工作:3. 内置 Tomcat 的配置3.1 第…

Git项目管理工具

分布式版本控制系统

62. 不同路径、64. 最小路径和

思路 dp:代表到达当前位置的总方式 初始化:第一行的位置dp[0][j]:当前位置只能由左边的位置向右移动得到 所以只有1种方式 d[0][j]1, d[0][0]1 第一列的位置 dp[i][0]:当前位置只能由上一个位置向下移动得到 除此之外的位置可以由…

【Python】基本使用

目录 变量的类型 整数 int 浮点数 float 字符串 str 字符串长度 格式化字符串 布尔类型 动态类型 注释 获取输入 浮点数比较 多元赋值 for循环 函数的定义和调用 创建函数/定义函数 调用函数/使用函数 列表 创建列表 切片操作 遍历列表 新增元素 判断元…

2024最全网络安全工程师面试题(附答案),金九银十找工作必看!

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

[matlab]matlab调用python的各种方法

前言 在MATLAB中,可以使用 py 函数来调用Python模块和函数。在此基础上,我们可以很轻易的调用python中的各种模块,方便我们在神经网络上的应用仿真。 以下是使用MATLAB调用Python模块的基本步骤: 确保你的系统已经正确安装了Py…