SSE优化引擎

1649 篇文章 11 订阅
1277 篇文章 12 订阅

周末在家尝试着使用sse对引擎进行优化。

 

关于如何使用sse这里并不多说,有很多资料,这里提一下,使用sse无非就是直接使用汇编或是使用函数指令,如果是诸如解码器核心之类的推荐使用汇编直接进行优化,毕竟可以将核心全部用汇编实现,其他情况下使用sse函数指令即可。

 

接下来说一下sse在3D引擎中的优化。可优化的地方很多,但总的来说绝大部分优化都集中在了数学运算,3D游戏的数学运算基本上都是向量运算非常适合进行sse优化,一般情况下把数学模块优化好也基本上就够了。

 

在我进行优化过程中发现效率并没有提升,甚至反而下降。经过分析和实践发现了问题,而且这个问题是一个深层次的设计问题。一般情况下我们很可能在开始写引擎些数学模块的时候并没有考虑用sse进行优化,至少已开始没有考虑。在后来进行sse优化的时候出了运算本身我们还要把向量(或者变量)转换为__m128这个数据类型上,在进行运算。其实运算本身是快的,但是把原有变量转换到__m128上是很耗时的,这样导致了使用sse优化的结果反而不如不优化之前。很自然我们会想能不能不进行转换,至少不掉用_mm_load_ps之类的函数进行转换,直接把指针给过去如__m128 *pdata = (__m128 *)(&vector);,这样做想得很好,但是不可行。原因很简单sse要求数据必须是16字节对齐,否则运算时会当机。

 

之所以说这是一个在引擎设计上的深层次问题,是因为解决这个问题要从三个方面入手:

1. 所有要参与sse运算的数据类型必须是16字节对齐的,不管是vector3还是vector2,也就是说它们的大小和vector4是一样的,这个如果不是在最开始就考虑好,很可能已经写了大量代码,后来要进行改动。具体而言向网格,骨骼等都是建立在这些基本数据结构上的,可能会带来一些改动。

 

2. 内存的分配释放需要自己进行改写或者重载,16字节对齐不仅指的是数据结构本身也是他的地址要16字节对齐。但我们调用的malloc这样的函数都是4字节对齐,这需要改写。

 

3. 数据的内存分布,尤其是矩阵这样的。一般来说矩阵就是一个float[16],对于cpu而言合适的排列并不一定是和sse,如下

 

(*vecOut)[0] = (*vecIn)[0]*(*mtxIn)[_00] + (*vecIn)[1]*(*mtxIn)[_10] + (*vecIn)[2]*(*mtxIn)[_20];
(*vecOut)[1] = (*vecIn)[0]*(*mtxIn)[_01] + (*vecIn)[1]*(*mtxIn)[_11] + (*vecIn)[2]*(*mtxIn)[_21];
(*vecOut)[2] = (*vecIn)[0]*(*mtxIn)[_02] + (*vecIn)[1]*(*mtxIn)[_12] + (*vecIn)[2]*(*mtxIn)[_22];

 

很显然如果用cpu进行运算的时候如果_00,_10,_20这些都是连续的那会显出提高cache的效率,但是要是用sse则_00,_01,_02连续效率才高,这也是事先要考虑好的地方

 

综上所术,要进行sse优化,必须先把相关参与运算的数据结构确保16字节对齐,在内存分配函数上要确保地址也是16字节对齐,使用有利于cache的矩阵数据内存排列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值