| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
There was a problem hiding this comment.
Some minor comments, but otherwise LGTM.
Sorry, something went wrong.
Co-authored-by: Sam Gross <colesbury@gmail.com>
Change-Id: I5df04888df81de26a04450a9a1a04d4db5026383
…on into fix-pythongh-138577 * 'fix-pythongh-138577' of github.com:CuriousLearner/cpython: pythongh-146202: Create tmp_dir in regrtest worker (python#146347) pythongh-144319: obtain SeLockMemoryPrivilege on Windows (python#144928) pythongh-146199: Fix error handling in `code_richcompare` when `PyObject_RichCompareBool` fails (python#146200) pythongh-146197: Include a bit more information in sys._emscripten_info.runtime (python#146346) pythongh-135871: Reload lock internal state while spinning in `PyMutex_LockTimed` (pythongh-146064) pythongh-145719: Add `.efi` file detection in `mimetypes` (python#145720)
…x_LockTimed` (pythongh-146064) Add atomic loads in the slow path of PyMutex to increase the number of lock acquisitions per second that threads can make on a shared mutex.
…x_LockTimed` (pythongh-146064) Add atomic loads in the slow path of PyMutex to increase the number of lock acquisitions per second that threads can make on a shared mutex.
| Back | FazBrowse Home | New Git URL |
This PR adds atomic loads in the slow path of PyMutex to increase the number of lock acquisitions per second that threads can make on a shared mutex.
The tricky part here is to avoid degrading the performance when the lock is highly contended; that is, when many threads are trying to acquire the mutex at a high frequency. This is because the current strategy of never reloading the mutex's state is, maybe counter-intuitively, the best strategy: avoid disturbing the thread that currently holds the mutex.
I've run the lockbench script to assess the performance using the following two scenarios, which were suggested by @colesbury:
The results are from my M4 MacBook, and Python was compiled with --disable-gil --enable-optimizations --with-lto.
The different lines below represent different reloading strategies:
The RELOAD_SPIN_COUNT = ... strategies also pseudo-randomize the reload recurrence by having each thread add its own thread-id to the counter. On my machine this nets a ~15/20% improvement over the same strategy, without this pseudo-randomization.
And here's the comparison between main and this PR, which picks the RELOAD_SPIN_COUNT = 3 strategy:
The fact that the high contention case shows as an improvement in this chart is misleading: I'd say it's in the noise range.