Archives

帖子来自 hello_wyq RSS

如何使用SSE指令提高FIR算法效率

作者: hello_wyq (1 篇文章) 日期: 一月 14, 2010 在 6:50 下午
评论 (2)

在搭建好VC6.0 SSE环境后,菜菜这里就开始现学现卖了J。因为自己的机器较老,仅支持MMX/SSE/SSE2指令,所以这里的方法也仅仅局限于此。 好的,言归正传!一般的FIR算法如下: <!--[if !supportEmptyParas]--> <!--[endif]--> 那么如何使用SSE指令来优化它呢? SSE的指令在于它使用了向量计算,极大的提高了运算速度,所以在优化之前,我们首先要对原有的c代码进行向量构造。因为水平有限,构造了一个粗糙向量(如果有那位网友能够指导我进行优化,我将万分感谢!)。 这里假设相关的所有长度都是16个字节的倍数。 <!--[if !supportEmptyParas]--> <!--[endif]--> 上面方法的主要思路是,在保持原有算法的基础上,对代码进行展开和重组,形成若干个向量组。在这个基础上,我们再使用SSE指令进行快速的矢量计算以获取高性能。从上的构建可以看出,我们有两组向量,分别用in和coeff指向。in指向的向量in[j]是16个字节地址对齐,而in[j+1], in[j+2], in[j+2]是不对齐的,故除了第一组能够使用movaps之外,其他都使用movups来装载。coeff仅使用一组向量和in的4组向量进行相乘,所以可以考虑将它放入xmm寄存器中提高运行效率。从上面的c代码可以看出,对于每组向量计算的结果将被放在4个单元中([127,96], [95,64],[63:32], [31:0]),所以在计算最后要将它们水平相加后再放入out数组中。 <!--[if ...

继续 ›

分类: 博客征文专栏
标签: