Recursive @threadpool_limits.wrap() calls do not behave as expected when recursing
Maintainer antworten meist innerhalb von 1 Tag
Ein zugehöriger Pull Request wurde bereits gemerged.
- #294 von @itamarst — gemerged
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- python
- Bereich
- performance
Rechercherichtung
The failing case is the test test_recursive_wrap_releases_the_shared_pool_claim, which needs a non-OpenMP OpenBLAS build with at least two threads. Start by running it with recurse(1) and reading how threadpool_limits.wrap restores limits and releases the controlling thread on return. Done when the test passes with recurse(1) and the existing recursion behaviour still holds.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Returning from a wrapped function should return to the previous level of thread limits at the time they were called, even in the face of recursion. That's not what happens in practice, though.
The following test fails on both master and 3.7 (i.e. it's not due to the controlling thread changes), but passes if recurse(1) is switched to recurse(0).
from threading import Thread
from threadpoolctl import threadpool_limits, ThreadpoolController
import numpy
import pytest
def run_in_thread(f, *args, **kwargs):
thread = Thread(target=lambda: f(*args, **kwargs))
thread.start()
thread.join()
return thread
def _non_openmp_openblas():
openblas = ThreadpoolController().select(internal_api="openblas")
if not openblas:
pytest.skip("requires OpenBLAS.")
libs = []
seen = set()
for lib in openblas.lib_controllers:
if lib.threading_layer == "openmp" or lib.filepath in seen:
continue
seen.add(lib.filepath)
libs.append(lib)
if not libs:
pytest.skip("require non-OpenMP OpenBLAS.")
return libs
def _require_resizable_non_openmp_openblas():
libs = _non_openmp_openblas()
lib = libs[0]
orig = lib.get_num_threads()
if orig is None or orig < 2:
pytest.skip("Test requires a non-OpenMP OpenBLAS with at least 2 threads")
return lib, orig
def test_recursive_wrap_releases_the_shared_pool_claim():
# One wrapped function calling itself must keep the limit between the inner
# return and the outer return, then restore the original count and drop the
# controlling thread. Another thread can then set the count.
lib, orig = _require_resizable_non_openmp_openblas()
@threadpool_limits.wrap(limits=1, user_api="blas")
def recurse(depth):
assert lib.get_num_threads() == 1
if depth:
recurse(depth - 1)
assert lib.get_num_threads() == 1
recurse(1)
assert lib.get_num_threads() == orig
observed = {}
def other_thread():
lib.set_num_threads(1)
observed["threads"] = lib.get_num_threads()
worker = run_in_thread(other_thread)
assert observed["threads"] == 1
- Vorherrschende Sprache
- Python
- Sterne
- 434
- Forks
- 38
- Ø Merge
- 1 T. 4 Std.
- Gemergte PRs (30 T.)
- 18
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus joblib/threadpoolctl
-
Drop 3.10Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
joblib/threadpoolctl#295 · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 78/100
joblib/threadpoolctl#291 ·
Maintainer antworten meist innerhalb von 1 Tag
-
OpenBLAS controlling thread logic needs to be smarter when thre are overlapping set/restore pairs in different threadsEvtl. vergeben @itamarst hat das vor 1 Tag übernommen. Offen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 35/100
joblib/threadpoolctl#299 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 57/100
joblib/threadpoolctl#276 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Make it possible to set active/spin wait behavior of LLVM/Intel OpenMP via `kmp_set_blocktime`Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 25/100
joblib/threadpoolctl#271 ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in joblib/threadpoolctl
Ähnliche Issues
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
micropython/micropython#19906 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
FinanceFlash/unvibecode#597 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
TomAnthony/YourOwnWeigh#21 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[BUG]: Compliance rules never see Unity Catalog views as viewsEvtl. vergeben @wagnercsantos hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
databrickslabs/ontos#1348 ·
Maintainer antworten meist innerhalb von 3 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 2 Tagen