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.
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
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
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