[Mesa-dev] [PATCH] gallium/util: don't let children of fork & exec inherit our thread affinity

Roland Scheidegger sroland at vmware.com
Tue Oct 30 23:13:32 UTC 2018


Am 30.10.18 um 23:55 schrieb Marek Olšák:
> On Tue, Oct 30, 2018 at 6:32 PM Gustaw Smolarczyk <wielkiegie at gmail.com
> <mailto:wielkiegie at gmail.com>> wrote:
> 
>     wt., 30 paź 2018, 23:01 Marek Olšák <maraeo at gmail.com
>     <mailto:maraeo at gmail.com>>:
> 
>         On Mon, Oct 29, 2018 at 12:43 PM Michel Dänzer
>         <michel at daenzer.net <mailto:michel at daenzer.net>> wrote:
> 
>             On 2018-10-28 11:27 a.m., Gustaw Smolarczyk wrote:
>             > pon., 17 wrz 2018 o 18:24 Michel Dänzer
>             <michel at daenzer.net <mailto:michel at daenzer.net>> napisał(a):
>             >>
>             >> On 2018-09-15 3:04 a.m., Marek Olšák wrote:
>             >>> On Fri, Sep 14, 2018 at 4:53 AM, Michel Dänzer
>             <michel at daenzer.net <mailto:michel at daenzer.net>> wrote:
>             >>>>
>             >>>> Last but not least, this doesn't solve the issue of
>             apps such as
>             >>>> blender, which spawn their own worker threads after
>             initializing OpenGL
>             >>>> (possibly not themselves directly, but via the toolkit
>             or another
>             >>>> library; e.g. GTK+4 uses OpenGL by default), inheriting
>             the thread affinity.
>             >>>>
>             >>>>
>             >>>> Due to these issues, setting the thread affinity needs
>             to be disabled by
>             >>>> default, and only white-listed for applications where
>             it's known safe
>             >>>> and beneficial. This sucks, but I'm afraid that's the
>             reality until
>             >>>> there's better API available which allows solving these
>             issues.
>             >>>
>             >>> We don't have the bandwidth to maintain whitelists. This
>             will either
>             >>> have to be always on or always off.
>             >>>
>             >>> On the positive side, only Ryzens with multiple CCXs get
>             all the
>             >>> benefits and disadvantages.
>             >>
>             >> In other words, only people who spent relatively large
>             amounts of money
>             >> for relatively high-end CPUs will be affected (I'm sure
>             they'll be glad
>             >> to know that "common people" aren't affected. ;).
>             Affected applications
>             >> will see their performance decreased by a factor of 2-8
>             (the number of
>             >> CCXs in the CPU).
>             >>
>             >> OTOH, only a relatively small number of games will get a
>             significant
>             >> benefit from the thread affinity, and the benefit will be
>             smaller than a
>             >> factor of 2. This cannot justify risking a performance
>             drop of up to a
>             >> factor of 8, no matter how small the risk.
>             >>
>             >> Therefore, the appropriate mechanism is a whitelist.
>             >
>             > Hi,
>             >
>             > What was the conclusion of this discussion? I don't see any
>             > whitelist/blacklist for this feature.
>             >
>             > I have just tested blender and it still renders on only a
>             single CCX
>             > on mesa from git master. Also, there is a bug report that
>             suggests
>             > this regressed performance in at least one game [1].
> 
>             I hooked up that bug report to the 18.3 blocker bug.
> 
> 
>             > If you think enabling it by default is the way to go, we
>             should also
>             > implement a blacklist so that it can be turned off in such
>             cases.
> 
>             I stand by my opinion that a white-list is appropriate, not a
>             black-list. It's pretty much the same as mesa_glthread.
> 
> 
>         So you are saying that gallium multithreading show be slower
>         than singlethreading by default.
> 
>         Marek
> 
> 
>     Hi Marek,
> 
>     The Ryzen optimization helps a lot of applications (mostly games)
>     and improves their performance, mostly because of the reduced cost
>     of communication between application's GL API thread and driver's
>     pipe/winsys threads.
> 
>     However, not all of the applications respond in the same way. The
>     thread affinity management is hacky, by which I mean that this
>     mechanism was not meant to mess with application threads from within
>     library's threads. As an example, blender's threads, which use
>     OpenGL "by accident", are forced to use the same CCX as the main
>     gallium/winsys thread, even if they are many and want to work on as
>     many CCXs as are possible. The thread that starts using GL spawns
>     many more threads that don't use GL at all, and the current atfork
>     mechanism doesn't help.
> 
>     The current mechanism of tweaking thread affinities doesn't work
>     universally with all Linux applications. We need a mechanism of
>     tweaking this behavior, either through a whitelist or through a
>     blacklist. As any application using OpenGL can be affected, I would
>     opt towards disabling this by default and providing a whitelist for
>     applications we know it would help.
> 
> 
> Multithreading is slower than singlethreading. You are pretty much
> saying that Mesa shouldn't use multithreading by default. Just think
> about that. NVIDIA would destroy us at all price points. I'm not that
> insane to disable the thread pinning by default.
> 
> The thread affinity API is very bad for this, but it's the only thing we
> have. Linux lacks a proper thread management API for the Zen
> architecture and the Linux scheduler does the worst thing for Ryzen (it
> puts threads on different CCXs), so the scheduler always works against
> us. It makes Ryzen as slow as possible.
> 
> Only Blender is affected negatively and there is a patch for it. Blender
> is open source, so it can just reset the thread affinity for new threads
> by itself, or set a thread affinity that works best with Ryzen. Mesa can
> contain the workaround out of courtesy.
> 
I think apps having to (re)set thread affinity explicitly to get some
kind of expected "default" behavior is not quite what we'd really want?
I don't have any solution though...

Roland


More information about the mesa-dev mailing list