[fpc-devel] Light weight threads for FPC

Marco van de Voort marcov at stack.nl
Fri Dec 14 16:18:52 CET 2007


> 
> > > You still can implement such thread pools on top of OpenMP(I) (or 
> > > similar APIs), if you need to get much lighter. ;)
> > 
> > Afaik there are threadpool classes in Indy, and they work. 
> 
> Thanks. I will take a look.

Please keep me informed, I'll have to do something like this soon too.
(though for now windows only). I did some thinking and have some urls. he
most importnant one for Windows can be found if you search for "Martin
Harvey" + threading faq (or threads faq) for primitives.

For me the calculated results also need to be retired (reconstructed), and
the task queue needs to be fifo.

My initial scheme is a bit like this:
http://www.stack.nl/~marcov/threads.png

Some points:

- the producer threads produce pieces of data, (20-40 /s typically.)
   total data (image) production rate 20-100MB/s (mbytes that is)
   With this scheme I hope to further increase this (e.g. 150-200MB/s tops)
- each datum is possibly splitted 2,3,4 way before being passed on to the
  calculation part.  The splitting is governed by symmetry concerns (for 
  easy joining) and a target of about 5-20ms of calculation time. The
  calculation time is not entirely constant but it has to cope well with the 
  worst case situation and be decent with the typical situation.
- A very small part of the calculation is not paralellisable, and has to be
  done when all parts are calculated. (in pic shown as the collection thread,
  which keeps track if the parts of a data packed are all calculated, and then
  does the final calculation) 
- Probably some of the final results need to go to the mainthread for
  displaying and serial I/O. (I use TComport atm, which is meant for the
  mainthread t.b.d.)
- Threads is the amount of free cores. Since the production threads also
  copy the data (which is already good for 10% cpu at these datarates) I'm
  thinking about using the cheapest (read: coolest) Core 2 quad core and
  have 3 worker threads operating maximally, and keep the other core free
  for the copying. (bind if necessary).

Main problem is how to efficiently implement the dispatching of tasks and
retiring them. I still need to take time to figure this out.



More information about the fpc-devel mailing list