On Sunday, April 03, 2011 01:27:34 am RJ Ryan wrote:
> Hey all,
>
> I'm messing around with tcmalloc and google-perftools.
> Check out the attached callgraph, focused on
> EngineMaster::process
>
> No surprises here.. we need to speed up those EQs.
Cool chart! FWIW, I ran into 3 things while working on IIR
filter optimization:
- SIMD/SSE operations are much more complex is the buffers
are not aligned.[1] Since portaudio can't guarantee
the buffer alignment, it's worth considering allocating
your own. They don't have to be... but it makes the
code a LOT easier to read and write.
- In the inner loop, cache misses are a big bottleneck.
For example, if you read/write a class member variable
during the inner loop, it will typically have to go
out of the cache to refresh the variable. On the IIR
filter I would pop my state to local variables and then
push them back to the class on exit.
- At the next higher level, cache misses also cause a
very big bottleneck. I didn't dig in to why... but
my guess is that Mixxx is running the 3 filters in
total parallel and then mixing them down.
For that last point... I have more to say, but I'm not sure
what you're doing with temporary buffers and how you're
mixing the buffers. (E.g. I know some apps would try to mix
the filters with something like out[k] = lo[k] + mid[k] +
hi[k]; -- and this causes cache misses.)
-gabriel
[1] When talking about SIMD, "aligned" means that the
pointer is 16-byte aligned. In other words:
assert( 0 == (((intptr_t)ptr) % 16) )
------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
Mixxx-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mixxx-devel