[Flac-dev] Proof-of-concept multithreaded FLAC encoder (take 2)

Frederick Akalin akalin at gmail.com
Tue May 13 03:46:34 PDT 2008


Hey again FLAC devs,

I managed to hack out another proof-of-concept multithreaded FLAC
encoder that is more amenable to streaming and also uses a fixed
buffer size.  The performance is pretty much the same as my earlier
version; that is, I can encode a 636 MB wave file in ~7s with 8
threads on an 8-core 2.8 GHz Xeon (I erroneously stated 3.0 GHz in my
last e-mail) vs ~32s with 1 thread.  I had mentioned near-linear
speedup in my last e-mail and to clarify that, it looks like 2x the
threads gives a ~1.7x time reduction (up to processor count).  I'm
actually suprised that this version isn't faster than the first one;
even turning off outputting to a file didn't help performance much,
either.

In this version, I create an encoder just write out the metadata.
Then I mmap() the input file and spawn encoding threads.  Each
encoding thread will look up the value of a shared sample counter,
increment it by some multiple of the blocksize (all atomically),
encode that many blocks, read a shared (output sample counter, output
offset) pair until the output sample is in its range, and then write
to the shared output file handle, updating the pair atomically.  Also,
I had to hack up libFLAC a bit more:

- I wrote a version of the stream encoder finish function that does
  not reset the private variables.  This actually isn't necessary for
  correctness but re-initializing the encoder for each frame hurts
  performance quite a bit.

I used pthread locking primitives for synchronization but I wrote it
so that it can easily be replaced by non-blocking constructs (which is
beyond the scope of this version) -- an earlier version used
non-blocking constructs but moving to pthread locks didn't seem to
affect performance so the bottleneck isn't there.

Updated patch file: http://www.akalin.cx/patch-libFLAC.2.in
Source file for this version: http://www.akalin.cx/mt_encode2.c

This should also compile cleanly with gcc 4.x with -Wall -Werror -g
-O2 -ansi.

Comments and thoughts on this version are welcome.

-- 
Frederick Akalin
http://www.akalin.cx


More information about the Flac-dev mailing list