Low-level Thinking in High-level Shading Languages
因为要反汇编shader代码,所以google了数学函数_sat的知识,发现了一些高级着色语言的优化相关的问题。Low-level Thinking in High-level Shading Languages,地址如下 http://www.luluathena.com/?p=1633
大意是汇编写shader,代码需要自己来优化。一直都是写HLSL这样的高级语言,编译器自动优化,却发现书写的代码会深深影响所生成的汇编效果。依赖编译器优化,总是那么不靠谱,所以懂点儿优化的程序员还是有市场的。
摘个例子1:
(x + 1.0f) * 0.5f所生成的汇编指令是两句,先add,再mul,很直观。而x*0.5f + 0.5f所生成的汇编指令只有一句,mad。这就是PC上编译器不会帮我们做的事情。由于浮点数的运算有误差,有时候编译器在为代码进行优化时,会由于修改了运算的顺序而导致INF和NAN(且不论编译器,甚至我们自己都会导致这种错误)。
考虑 x = 0.2f 时:
sqrt(0.1f * (0.2f - x)) 返回0
sqrt(0.02f - 0.1f * x) 返回 NaN //由于0.02f - 0.1f*0.2f 返回了一个极小的负值,导致开方出错
例子2:
float AlphaThreshold(float alpha, float threshold, float blendRange)
{
float halfBlendRange = 0.5f*blendRange;
threshold = threshold*(1.0f + blendRange) - halfBlendRange;
float opacity = saturate( (alpha - threshold + halfBlendRange)/blendRange );
return opacity;
}
对应的汇编代码:
mul r0.x, cb0[0].y, l(0.500000)
add r0.y, cb0[0].y, l(1.000000)
mad r0.x, cb0[0].x, r0.y, -r0.x
add r0.x, -r0.x, v0.x
mad r0.x, cb0[0].y, l(0.500000), r0.x
div_sat o0.x, r0.x, cb0[0].y
而这段代码的精简版本:
// scale = 1.0f / blendRange
// offset = 1.0f - (threshold/blendRange + threshold)
float AlphaThreshold(float alpha, float scale, float offset)
{
return saturate( alpha * scale + offset );
}
对应的汇编就只有一条。
mad_sat o0.x, v0.x, cb0[].x, cb0[].y
专注做产品的程序员不应该考虑太多底层优化的东西,而对于引擎程序员的要求,不论GPU还是CPU编程,都应该Low-level Thinking in High-level Languages
Low-level Thinking in High-level Shading Languages的更多相关文章
- 设计与实现的简单和经常使用的权限系统(五岁以下儿童):不维护节点的深度level,手工计算level,树形结构
以这种方式.和第三的类似介绍.所不同的是.深度未在数据库中存储节点level,添加和更改时间,护.而是,在程序中,实时去计算的. 至于后面的,依照level升序排序,再迭代全部的节点构造树,与第三篇 ...
- loadrunner / socket level data and wininet level data
s loadrunner录制脚本时,此网站证书无效/无法录制到脚本问题解决 http://www.51testing.com/html/64/497364-3569552.html lr录制后空白_l ...
- 简洁常用权限系统的设计与实现(五):不维护节点的深度level,手动计算level,构造树
这种方式,与第三篇中介绍的类似.不同的是,数据库中不存储节点的深度level,增加和修改时,也不用维护.而是,在程序中,实时去计算的. 至于后面的,按照level升序排序,再迭代所有的节点构造树,与 ...
- 简洁常用权限系统的设计与实现(六):不维护节点的深度level,手动计算level,构造树 (把一颗无序的树,变成有序的)
本篇介绍的方法,参考了网上的代码.在递归过程中,计算level,是受到了这种方法的启发. CSDN上有篇关于树的算法,目标是把一个无序的树,变成有序的. 我看了下代码,并运行了下,感觉是可行的. 我 ...
- [LeetCode] Binary Tree Level Order Traversal II 二叉树层序遍历之二
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- [LeetCode] Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- 《InsideUE4》-3-GamePlay架构(二)Level和World
UE4深入学习QQ群: 456247757 引言 上文谈到Actor和Component的关系,UE利用Actor的概念组成一片游戏对象森林,并利用Component组装扩展Actor的能力,让世界里 ...
- 【leetcode】Binary Tree Zigzag Level Order Traversal (middle)
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
随机推荐
- 02 - Unit06:弹出对话框
弹出对话框 如何实现弹出 //弹出出对话框 $("#can").load("alert/alert_notebook.html"); //显示背景色 $(&qu ...
- pgsql的同步须知
pgsql的同步模式是根据master上的日志来做的同步,有两种同步方式,参考http://www.chinaxing.org/articles/Postgres/2012/12/14/2012-12 ...
- bzoj 3159: 决战
Description 树上链翻转,链加,查询链上的和/max/min 树链剖分套treap,修改查询可以用类似线段树的写法,翻转可以利用分裂合并和翻转标记实现,时间复杂度O(nlog2n) 实测除了 ...
- pytest框架 里 fixture 参数化的方法
- JavaScript(一) - 精简
javascript一 javascript 是什么? 1. 运行在浏览器端 ,定义网页的行为, 2.所有的html页面都有js. 二 javascript 定义方式? 1 在html文件里 js 可 ...
- 关于LaaS,PaaS,SaaS一些个人的理解
关于LaaS,PaaS,SaaS一些个人的理解 其实如果从整个程序运营的角度来考虑比较好 第一个LaaS 这个也叫做Haas 就是硬件或者基础设置即服务 比如现在的 aws azure 阿 ...
- 如何优化Java垃圾回收-zz
为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...
- 消息队列kafka
消息队列kafka 为什么用消息队列 举例 比如在一个企业里,技术老大接到boss的任务,技术老大把这个任务拆分成多个小任务,完成所有的小任务就算搞定整个任务了. 那么在执行这些小任务的时候,可能 ...
- window 10 下解压缩版MySQL5.7.24的安装
安装步骤: 1.下载mysql-5.6.40-winx64.zip https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.24-winx64.zip ...
- UIview需要知道的一些事情:setNeedsDisplay、setNeedsLayout
UIview需要知道的一些事情:setNeedsDisplay.setNeedsLayout 1.在Mac OS中NSWindow的父类是NSResponder,而在i OS 中UIWindow 的父 ...