2017-02-09 2 views
2

Dies ist eine Art allgemeine Frage zu einer bestimmten Implementierung, die ich im Hinterkopf habe, ob Python-Routinen für die Verwendung innerhalb der GIL in einer Umgebung mit gemeinsam genutztem Speicher sicher sind. Insbesondere möchte ich scipy.optimize.curve_fit auf einem großen Array innerhalb einer cython Funktion verwenden.Verwenden von SCIPY-Routinen außerhalb der GIL

Die Daten können als ein 2d numpy Array (sagen wir von Floats) mit der Achse ausgedrückt werden, um entlang zu passen und die andere die serialisierte Achse über parallelisiert werden. Dann möchte ich einfach die GIL veröffentlichen und anfangen, die Daten mit einer cython.parallel.prange zu durchlaufen (die Idee ist dann, dass ich alle meine Kerne gleichzeitig arbeiten lassen kann).

Das Hauptproblem, das ich vorhersehen kann, ist, dass curve_fit nicht funktioniert "an Ort und Stelle"; Es gibt die Fit-Werte der Parameter (und optional ihre Kovarianzmatrix) zurück und muss diesen Speicher zu einem bestimmten Zeitpunkt zuordnen. (Natürlich habe ich auch keine Ahnung von irgendeiner Zwischenspeicherzuweisung, die die Routine ausführt.) Ich mache mir Sorgen darüber, wie dies außerhalb der GIL funktionieren wird, wobei viele Threads gleichzeitig arbeiten.

Ich realisiere, dass die Antwort einfach sein könnte "es sollte gut funktionieren, gehen Sie es versuchen", aber ich hoffe, eine Idee zu bekommen, worauf zu achten. Ich stelle auch fest, dass diese Frage ähnlich ist wie bei anderen über Parallelisierung scipy/numpy Routinen, aber ich denke, dass dies anders formuliert ist, dass fällt in den Bereich cython einer C-Umgebung für Python.

Danke für jede Hilfe/Vorschläge.

+2

Einige zusammengestellt 'numpy' und' scipy' Code hat mit einem 'ohne gil' Makro markiert Codeblocks. Ich würde vorschlagen, den 'curve_fit'-Code zu studieren. Es kann eine Mischung aus Python und kompiliertem Code sein, vielleicht sogar ein Aufruf einer externen Bibliothek. – hpaulj

+0

Zu @ hpauljs Kommentar hinzufügen: Wenn der scipy-Code das GIL intern freigibt, dann profitieren Sie von der parallelen Schleife, ohne das GIL selbst freigeben zu müssen. _Wie immer es ist, wenn Python-Objekte zurückgegeben werden, sei vorsichtig, da es sich herausstellt, dass Cython sie nicht Thread-lokal macht. – DavidW

+0

Noch ein Kommentar: 'curve_fit' wird wahrscheinlich die meiste Zeit damit verbringen, die vom Benutzer gelieferte Funktion aufzurufen (was die GIL erfordert), so dass die Vorteile wahrscheinlich gering sind – DavidW

Antwort

3

Nicht sicher. Wenn CPython diesen Code ohne die GIL sicher ausführen könnte, hätten wir die GIL gar nicht erst.

2

Sie finden möglicherweise die folgende Diskussion, um auf Parallel Programming in SciPy von Interesse zu sein.

[Ich würde dies einen Kommentar als nur gebucht haben, aber ich fehle den erforderlichen Ruf.]

Verwandte Themen