摘要: 引自:http://hi.baidu.com/sige_online/blog/item/d8fdfffc8f0033f7fd037fac.html我和这个家伙打交道已经有差不多七年时间了,所以脾性非常熟悉。首先求分量的平方和,判断是否为0(问我为什么不直接用 if( len == 0 )?好样的,请先去复习一下浮点数的基本知识),然后再求倒数,最后反映到分量上。在把它写成SSE intrinsic格式前,我先引入另外一个能极大提升运算效率的函数,求平方根的倒数。有数值运算编成经验的人都知道,如果说除法是恶魔的话,那么平方根就是撒旦了,而平方根的倒数简直就是撒旦他妈。虽然上面提供了倒数的逼近方 阅读全文
posted @ 2011-06-26 20:57 南山一小妖 阅读(1665) 评论(1) 推荐(0) 编辑
摘要: 引自:http://hi.baidu.com/sige_online/blog/item/d8fdfffc8f0033f7fd037fac.html然后我们把注意力放到一条非常特殊的指令shufps(对应intrinsic是_mm_shuffle_ps)上面。这是一条非常有用的指令,它可以把两个操作数的分量以特定的顺序排列并赋予给目标数。比如__m128 b = _mm_shuffle_ps( a , a , 0 ); 则 b 的所有分量都是 a 中下标为0的分量。第三个参数控制分量分配,是一个8bit的常量,这个常量的1~8位分别控制了从两个操作数中选择分量的情况,具体怎么控制将在后面讨论S 阅读全文
posted @ 2011-06-26 20:54 南山一小妖 阅读(2146) 评论(0) 推荐(0) 编辑
摘要: 引自:http://hi.baidu.com/sige_online/blog/item/d8fdfffc8f0033f7fd037fac.html下面将通过几个简单的运算例子介绍SSE intrinsic的使用。首先,使用SSE需要一个新的头文件 #include <xmmintrin.h>里面定义了一个新的数据类型,__m128,这是一个128位、4个32位单精度浮点数的结构,如果你正在使用VC.net,你会看到它是一个关键字,被当作一种基本数据类型。要是你不打算使用汇编SSE,那么就没必要深究编译器在幕后到底如何处理__m128类型的数据,你只需要知道里面能存放四个float 阅读全文
posted @ 2011-06-26 20:48 南山一小妖 阅读(2228) 评论(0) 推荐(0) 编辑
摘要: 引自:http://hi.baidu.com/sige_online/blog/item/d8fdfffc8f0033f7fd037fac.html毫无疑问,数学库是图形程序的基石,是图形程序运行效率的关键之一。一个优秀的数学库可以让图形程序运行得更流畅,甚至要快上几十倍上百倍。有时候替换一条除法运算会带来成倍的效率增长,比如用乘以 1/op 替换 vector 里的 operator /。当然,更高级的优化是使用 SIMD 优化海量运算,这就是本文的中心——SSE/SSE2 优化。在描述 SSE/SSE2 优化前,我先介绍一般的 vector/matrix 库构造。当然,在 OpenEXR. 阅读全文
posted @ 2011-06-26 20:36 南山一小妖 阅读(2036) 评论(1) 推荐(0) 编辑