SSE指令集优化代码一个函数,导致后面函数运行变慢了是怎么回事?

62 views
Skip to first unread message

Jeremy.Chen

unread,
Nov 12, 2009, 12:48:31 AM11/12/09
to TopLanguage
请问大虾们,有没有碰到过我这样类似的问题,是不是内存泄露,还是其他什么原因,怎么来排查,把后面减慢的函数提速到以前呢?
SSE指令集优化一个函数,该函数效率提高了60%,可是接下来的函数,运行速度反而都变慢了,
致使整快代码没怎么提速了,杯具的。

ps: 还有一般各位都是用什么来优化提速代码的呢,用了intel的IPP,发现有时候函数不完整,少了矢量间叠加等的函数,不能把原来的代码全
部翻译过来。

Shuo Chen

unread,
Nov 12, 2009, 12:57:14 AM11/12/09
to TopLanguage
给个能重现你说的现象的例子呗,要能编译运行的,不然让我们怎么猜?

Jianshi Huang

unread,
Nov 12, 2009, 1:08:47 AM11/12/09
to pon...@googlegroups.com
2009/11/12 Jeremy.Chen <you...@gmail.com>:

> 请问大虾们,有没有碰到过我这样类似的问题,是不是内存泄露,还是其他什么原因,怎么来排查,把后面减慢的函数提速到以前呢?
> SSE指令集优化一个函数,该函数效率提高了60%,可是接下来的函数,运行速度反而都变慢了,
> 致使整快代码没怎么提速了,杯具的。
>

是啊,请给出例子。

>
> ps: 还有一般各位都是用什么来优化提速代码的呢,用了intel的IPP,发现有时候函数不完整,少了矢量间叠加等的函数,不能把原来的代码全
> 部翻译过来。

矢量叠加? BLAS-1


--
黄 澗石 (Jianshi Huang)
http://huangjs.net/

Jeremy.Chen

unread,
Nov 12, 2009, 1:10:16 AM11/12/09
to TopLanguage
http://mroy.chez-alice.fr/yin/a00093.html

上面算法的主函数里有这样三个函数:
00269 computeDiff(s, psin, psprev); // step 2,3
00270
00271 // make preliminary guesstimate
00272 estimateFreq(psin, 0, W);
00273
00274 // return best local frequency estimate (is delayed by
TMAX /2)
00275 return getBestLocalEstimate();


其中computeDiff用SSE优化后(最下面),循环送入帧数据后,剩下的两个函数运行时间都变慢了,找不原因-_-!

> > 部翻译过来。- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Jeremy.Chen

unread,
Nov 12, 2009, 1:18:30 AM11/12/09
to TopLanguage

> 矢量叠加? BLAS-1
>
> --
-----------------------
for (unsigned i = 1; i < that->W; ++i) {
sum[i] = sum[i-1] + d[i]; //sum
}
就是sum数组,内部的求和,用IPP怎么搞定?

Jianshi Huang

unread,
Nov 12, 2009, 1:42:22 AM11/12/09
to pon...@googlegroups.com
2009/11/12 Jeremy.Chen <you...@gmail.com>:

This is not 矢量叠加。。。it's a convolution.

至于IPP怎样实现, no idea.

Jianshi Huang

unread,
Nov 12, 2009, 1:53:03 AM11/12/09
to pon...@googlegroups.com
2009/11/12 Jeremy.Chen <you...@gmail.com>:

> http://mroy.chez-alice.fr/yin/a00093.html
>
> 上面算法的主函数里有这样三个函数:
> 00269 computeDiff(s, psin, psprev); // step 2,3
> 00270
> 00271 // make preliminary guesstimate
> 00272 estimateFreq(psin, 0, W);
> 00273
> 00274 // return best local frequency estimate (is delayed by
> TMAX /2)
> 00275 return getBestLocalEstimate();
>
>
> 其中computeDiff用SSE优化后(最下面),循环送入帧数据后,剩下的两个函数运行时间都变慢了,找不原因-_-!
>

Could be an alignment problem.

把你的 platform, compiler 参数贴出来看看。


>
> On 11月12日, 下午1时57分, Shuo Chen <giantc...@gmail.com> wrote:
>> 给个能重现你说的现象的例子呗,要能编译运行的,不然让我们怎么猜?
>>
>>
>>
>> Jeremy.Chen wrote:
>> > 请问大虾们,有没有碰到过我这样类似的问题,是不是内存泄露,还是其他什么原因,怎么来排查,把后面减慢的函数提速到以前呢?
>> > SSE指令集优化一个函数,该函数效率提高了60%,可是接下来的函数,运行速度反而都变慢了,
>> > 致使整快代码没怎么提速了,杯具的。
>>
>> > ps: 还有一般各位都是用什么来优化提速代码的呢,用了intel的IPP,发现有时候函数不完整,少了矢量间叠加等的函数,不能把原来的代码全
>> > 部翻译过来。- 隐藏被引用文字 -
>>
>> - 显示引用的文字 -

--

Jeremy.Chen

unread,
Nov 12, 2009, 2:59:38 AM11/12/09
to TopLanguage

xp下试验的吧
参数:
w = (unsigned)ceil(float(11025/60));
tmax = w;
yin.build(w, tmax);

for (i=0;i<n;++i)
{
//vBuffer是一段音频的buffer
outFrequencies[i] = yin.tick(vBuffer[i]);

Jeremy.Chen

unread,
Nov 12, 2009, 3:00:28 AM11/12/09
to TopLanguage
YinACF<float> yin;

> > 黄 澗石 (Jianshi Huang)http://huangjs.net/- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Jianshi Huang

unread,
Nov 12, 2009, 3:09:00 AM11/12/09
to pon...@googlegroups.com
2009/11/12 Jeremy.Chen <you...@gmail.com>:
>
>
>
>
> xp下试验的吧
> 参数:

我指的是 compiler 参数。

--

Jeremy.Chen

unread,
Nov 12, 2009, 4:32:43 AM11/12/09
to TopLanguage
vs2005下:
/Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_AFXDLL" /D "_MBCS" /Gm /
EHsc /RTC1 /MDd /Yu"stdafx.h" /Fp"Debug\YinSpeedTest.pch" /Fo"Debug\
\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /
errorReport:prompt

> 黄 澗石 (Jianshi Huang)http://huangjs.net/- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Jianshi Huang

unread,
Nov 12, 2009, 4:42:09 AM11/12/09
to pon...@googlegroups.com
2009/11/12 Jeremy.Chen <you...@gmail.com>:

> vs2005下:
> /Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_AFXDLL" /D "_MBCS" /Gm /
> EHsc /RTC1 /MDd /Yu"stdafx.h" /Fp"Debug\YinSpeedTest.pch" /Fo"Debug\
> \" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /
> errorReport:prompt
>
>

According to http://msdn.microsoft.com/en-us/library/fwkeyyhe(VS.71).aspx

/Od means disable optimization.

And many other options indicating it's a debug build, which is bad for
benchmark.

Could you make a 'release' build or replace /Od with /O2 ?

--

Jeremy.Chen

unread,
Nov 12, 2009, 4:42:57 AM11/12/09
to TopLanguage
刚刚贴错了,贴了debug的了,抱歉的。

release下的,我的是默认的,谢谢Jianshi Huang了,调了好一阵,都没找到solution。

/O2 /GL /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_AFXDLL" /D "_MBCS" /
FD /EHsc /MD /Yu"stdafx.h" /Fp"Release\YinSpeedTest.pch" /Fo"Release\
\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /
errorReport:prompt

> 黄 澗石 (Jianshi Huang)http://huangjs.net/- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Jianshi Huang

unread,
Nov 12, 2009, 4:46:52 AM11/12/09
to pon...@googlegroups.com
2009/11/12 Jeremy.Chen <you...@gmail.com>:

> 刚刚贴错了,贴了debug的了,抱歉的。
>
> release下的,我的是默认的,谢谢Jianshi Huang了,调了好一阵,都没找到solution。
>

Ok. 现在没有变慢了?

--

Jeremy.Chen

unread,
Nov 12, 2009, 4:49:15 AM11/12/09
to TopLanguage
我看看编译器参数,我想可能问题就出在那了,因为我用一直默认release下编译,没调整过参数了。还不行,还得用FPU等继续修改,苦恼的。

Anyway,thanks so much:=)

On 11月12日, 下午5时42分, Jianshi Huang <jianshi.hu...@gmail.com> wrote:
> 2009/11/12 Jeremy.Chen <you...@gmail.com>:
>

> > vs2005下:
> > /Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_AFXDLL" /D "_MBCS" /Gm /
> > EHsc /RTC1 /MDd /Yu"stdafx.h" /Fp"Debug\YinSpeedTest.pch" /Fo"Debug\
> > \" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /
> > errorReport:prompt
>

> According tohttp://msdn.microsoft.com/en-us/library/fwkeyyhe(VS.71).aspx

> >> 黄 澗石 (Jianshi Huang)http://huangjs.net/-隐藏被引用文字 -
>
> >> - 显示引用的文字 -
>
> --

Jeremy.Chen

unread,
Nov 12, 2009, 4:51:15 AM11/12/09
to TopLanguage
就是relase下,出现后面函数运算速度反而变长了,导致整个算法没提速了

> >> 黄 澗石 (Jianshi Huang)http://huangjs.net/-隐藏被引用文字 -
>
> >> - 显示引用的文字 -
>
> --

Jianshi Huang

unread,
Nov 12, 2009, 5:15:37 AM11/12/09
to pon...@googlegroups.com
2009/11/12 Jeremy.Chen <you...@gmail.com>:
> 就是relase下,出现后面函数运算速度反而变长了,导致整个算法没提速了
>

hmm... no idea. 试试 /Oa,assume no aliasing.

或者看看2个版本的 assembly 有何区别。

--

Reply all
Reply to author
Forward
0 new messages