WIP: Barriers - Mailing list pgsql-hackers
From | Thomas Munro |
---|---|
Subject | WIP: Barriers |
Date | |
Msg-id | CAEepm=2_y7oi01OjA_wLvYcWMc9_d=LaoxrY3eiROCZkB_qakA@mail.gmail.com Whole thread Raw |
Responses |
Re: WIP: Barriers
Re: WIP: Barriers Re: WIP: Barriers |
List | pgsql-hackers |
Hi hackers, I would like to propose "barriers" for Postgres processes. A barrier is a very simple mechanism for coordinating parallel computation, as found in many threading libraries. First, you initialise a Barrier object somewhere in shared memory, most likely in the DSM segment used by parallel query, by calling BarrierInit(&barrier, nworkers). Then workers can call BarrierWait(&barrier) when they want to block until all workers arrive at the barrier. When the final worker arrives, BarrierWait returns in all workers, releasing them to continue their work. One arbitrary worker receives a different return value as a way of "electing" it to perform serial phases of computation. For parallel phases of computation, the return value can be ignored. For example, there may be preparation, merging, or post-processing phases which must be done by just one worker, interspersed with phases where all workers do something. My use case for this is coordinating the phases of parallel hash joins, but I strongly suspect there are other cases. Parallel sort springs to mind, which is why I wanted to post this separately and earlier than my larger patch series, to get feedback from people working on other parallel features. A problem that I'm still grappling with is how to deal with workers that fail to launch. What I'm proposing so far is based on static worker sets, where you can only give the number of workers at initialisation time, just like pthread_barrier_init. Some other libraries allow for adjustable worker sets, and I'm wondering if a parallel leader might need to be able to adjust the barrier when it hears of a worker not starting. More on that soon. Please see the attached WIP patch. I had an earlier version with its own waitlists and signalling machinery etc, but I've now rebased it to depend on Robert Haas's proposed condition variables, making this code much shorter and sweeter. So it depends on his condition-variable-vX.patch[1], which in turn depends on my lwlocks-in-dsm-vX.patch[2] (for proclist). When Michaël Paquier's work on naming wait points[3] lands, I plan to include event IDs as an extra argument to BarrierWait which will be passed though so as to show up in pg_stat_activity. Then you'll be able to see where workers are waiting for each other! For now I didn't want to tangle this up with yet another patch. I thought about using a different name to avoid colliding with barrier.h and overloading the term: there are of course also compiler barriers and memory barriers. But then I realised that that header was basically vacant real estate, and 'barrier' is the super-well established standard term for this parallel computing primitive. I'd be grateful for any thoughts, feedback, flames etc. [1] https://www.postgresql.org/message-id/flat/CA%2BTgmoaj2aPti0yho7FeEf2qt-JgQPRWb0gci_o1Hfr%3DC56Xng%40mail.gmail.com [2] https://www.postgresql.org/message-id/flat/CAEepm%3D0Vvr9zgwHt67RwuTfwMEby1GiGptBk3xFPDbbgEtZgMg%40mail.gmail.com [3] https://www.postgresql.org/message-id/flat/CAB7nPqTGhFOUHag1eJrvsKn8-E5fpqvhM7aL0tAfsDzjQG_YKQ@mail.gmail.com -- Thomas Munro http://www.enterprisedb.com
Attachment
pgsql-hackers by date: