深度优化:学习SSE指令

程序跑的太慢怎么办?之前我给出的答案是:用x64环境编译执行程序;用多线程、多进程模式;用CUDA加速。而现在,又有了一种新的解决方案:用CPU的SSE、SSE2等指令集。

因为处理图像数据时大量用到浮点数操作,而且都是一连串一起使用的,所以,用SSE2加速可以取得较好的效果。参见http://dev.gameres.com/Program/Other/sseintro.htm的相关代码,自己模仿了一下,发现很容易写:

int calc_simi(float *feat)
{
int i,j;
float *a,*b,t;
float min_dst = 99999;
float dst;
int id=0;
for(i=0;i

其中dic是一个二维矩阵,目的是求出当前feat向量和二维矩阵中哪一行向量的差最小,返回这个id。calc_simi是普通的实现,calc_simi_sse是利用sse2指令集实现的。

废话不多说,看时间测试时间:

x86 x64
precise 1224 371
fast 301 302
precise_sse 146 114
fast_sse 148 119

其中,precise和fast对应编译器选项当中浮点数精度要求(因为发现结果木有差异。。),_sse代表利用了sse指令集(编译器优化当中不要选使用sse2,这样会变慢……),x86和x64代表编译环境,由此可以发现,sse会快,而且在x64下比fast浮点运算还快了2.5倍左右!因为sse2每次处理4个浮点数,所以最多也就快4倍,效果很显著了~

so,最终版的优化看来会结合sse2、多线程技术吧(因为CUDA和sse2冲突,而sse2稳定……)