用户
 找回密码
 立即注册
搜索

[高阶] 一些常见动作的浮点操作数量

[复制链接]

18

主题

185

帖子

62

积分

注册会员

Rank: 2

积分
62
QQ
发表于 2006-2-1 21:37:00
一些常见动作的浮点操作数量
texture interpolation(FP16 on NV G60/G70):
Bilinear interpolation per one component takes 4 multiplies, 3 adds and 2 subs: 9 ops, x4 channels = 36 flops.

blend operation (FP16  on G60/G70/X1000buffer) 12 flops.

vec4 add/mul/sub(?)/div(?): 1flop*4 = 4flops

vec4 mad: 2 flops*4 = 8 flops

nrm:

squareRootOfTheSum = (src0.x*src0.x + src0.y*src0.y + src0.z*src0.z)1/2;
dest.x = src0.x * (1 / squareRootOfTheSum);
dest.y = src0.y * (1 / squareRootOfTheSum);
dest.z = src0.z * (1 / squareRootOfTheSum);
dest.w = src0.w * (1 / squareRootOfTheSum);
"在計算「平方根倒數」的時候,通常是用查表(假設不需要高的精確度),因此,它通常不算成一個浮點運算。
因此,實際上的運算數目,應該是計算平方值的五個運算(三個乘法和兩個加法),再加上四個乘法,總共應該是九個。"

剩下的以后再上
使用道具 举报 回复
发表于 2006-6-26 20:23:00
reciprocal square roots在游戏中vector normalization的计算很有必要,的确查表可以换来速度提升,这也是一般游戏所采用的方法。但如果看看quake3的源代码,你就会发现carmark确实很强。
给出purdue unversity某位同学精简quake3相关代码后的一段代码:
float InvSqrt(float x)// to compute x*-0.5e
{
  float xhalf = 0.5f*x;
  int i = *(int*)&x; // get bits for floating value
  i = 0x5f3759df- (i>>1); // gives initial guess y0  这个关键初始值carmark和这个同学的不一样,我用的carmark的
  x = *(float*)&i; // convert bits back to float
  x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
  return x;
}
1次迭代产生的精度就足够了,carmark确实很强。
使用道具 举报 回复 支持 反对
发表于 2006-7-16 11:50:00
去看看定点DSP怎么产生足够精度的小数(比如Ti的一堆数学运算库函数),就知道大部分pc平台的程序员在算法优化方面差距还太远。
使用道具 举报 回复 支持 反对
发表于 2006-7-16 15:16:00
原帖由 vp 于 2006-7-16 11:50 发表
去看看定点DSP怎么产生足够精度的小数(比如Ti的一堆数学运算库函数),就知道大部分pc平台的程序员在算法优化方面差距还太远。
不是很清楚你这个说法是什么意思.

既然PC上面FPU是标准, 那么似乎没有道理不用, 而且有时候从issue的考虑, 适量的浮点整数搭配会比纯粹整数来得快。

另外PC通用数学库是为精度考虑的, 游戏方面必要的时候可以做一些特殊处理, 但是没有必要贬低通用函数库。毕竟我们计算机做的很多东西,是容不得致命误差的,有时候需要保守一点。
使用道具 举报 回复 支持 反对
发表于 2006-7-16 18:47:00
我没有贬低通用库函数,我的意思是在游戏这类对精度要求不高的运算上,可以在某些时候采用定点算法来取代浮点算法。而定点算法的典型应用就是Ti在其定点DSP上写的库函数,可以作为参考。而PC程序员由于几乎不会考虑浮点和定点有什么区别(谁让PC有FPU呢),因此很多人甚至不知道定点小数为何物。定点算法基本等同于整数运算,因此比浮点运算需要的指令周期更少。但是其精度有限,需要更长的位数来保证精度,同时容易出现溢出等问题,因此需要程序员对其精心设计,一般PC程序员是不会干这种脏活累活的,只有定点DSP开发者才会专心于这些算法。
使用道具 举报 回复 支持 反对
发表于 2006-7-16 21:48:00
原帖由 vp 于 2006-7-16 18:47 发表
我没有贬低通用库函数,我的意思是在游戏这类对精度要求不高的运算上,可以在某些时候采用定点算法来取代浮点算法。而定点算法的典型应用就是Ti在其定点DSP上写的库函数,可以作为参考。而PC程序员由于几乎不会考 ...
能否提供一些应用参考呢?

PC程序员由于其宽裕的环境, 确实相对懒一些. 但是你说的浮点运算采用定点, 我不觉得会比现在的方案快. 你说的方法, 一般在是在手机之类的便携3D引擎中出现的。使用定点模拟浮点不是免费的, 需要付出精度和速度的代价, 在PC上面可以说是舍近求远的行为了。现在PC中研究这个的人也很多, 一般结果不外落入查表和级数开展两种, 速度已经相当快了。可以说, 转成定点计算再转回浮点只会更慢, 还不如考虑一下SSE优化。
使用道具 举报 回复 支持 反对
发表于 2006-8-7 19:33:00
原帖由 carl319 于 2006-6-26 20:23 发表
reciprocal square roots在游戏中vector normalization的计算很有必要,的确查表可以换来速度提升,这也是一般游戏所采用的方法。但如果看看quake3的源代码,你就会发现carmark确实很强。
给出purdue unversity某 ...
如果用 SSE, 一条汇编 sqrtss 就差不多了
使用道具 举报 回复 支持 反对
发表于 2006-9-4 16:55:00
回复 #2 carl319 的帖子
这个反sqrt的技巧在ICC编译器面前就是笑话,轻易就能干掉。 一大悲剧。
使用道具 举报 回复 支持 反对
发表于 2006-9-4 17:03:00
回复 #5 vp 的帖子
TI的C62/64浮点库,DSP若要达到float基本精度来计算,是要付出毁灭性的性能倒退的代价。 性能上, 能不能干过被淘汰了好几年的CPU都是大问题,将被轻易摧毁。

一些DSP开发人员, 根本不了解 CPU的性能优化 已经能够深入到什么地步, 或者对DSP性能限制并不了解,太不知深浅了。
使用道具 举报 回复 支持 反对
发表于 2006-9-20 21:14:00
回忆起当年ps没有fpu,不得不手写并且维护一个定点库的惨痛经历。
无论如何不想再回到那个时代了,代码维护的噩梦啊。
使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则