NumPy-Skalierung auf Free-Threaded Python: Ein Durchbruch für paralleles Rechnen
Scaling NumPy on Free-Threaded Python
Der Blogbeitrag von Quansight Labs untersucht, wie NumPy, die fundamentale Bibliothek für numerisches Rechnen in Python, von der Unterstützung für Free-Threaded Python profitiert. Free-Threaded Python, auch bekannt als Python ohne GIL, ermöglicht echte Parallelität. Der Artikel zeigt, wie NumPy angepasst wurde, um Thread-Sicherheit zu gewährleisten, und präsentiert beeindruckende Leistungssteigerungen bei Multithread-Anwendungen. Dabei werden technische Herausforderungen und Lösungen detailliert erläutert.
Durch die Unterstützung von Free-Threaded Python kann NumPy nun die volle Leistung moderner Mehrkernprozessoren ausschöpfen, was zu erheblichen Beschleunigungen bei rechenintensiven Aufgaben führt.
- w-m
Das ist gut geschrieben. Ich konnte gut folgen, vom Aufbau über die Engpässe bis zur Lösung des Performance-Bugs. Auch die Pull Requests sind sehr angenehm zu lesen: Der Großteil davon besteht aus nur einer Handvoll geänderter Zeilen mit hinzugefügten Tests und etwas Dokumentation.
Ich war einen Moment lang überrascht, dass diese Arbeit aus einem Bericht auf StackOverflow stammt. Ich hatte gedacht, SO sei praktisch tot und von seiner Community verlassen. Aber vielleicht sollte ich meine eigene Erfahrung nicht auf alle anderen projizieren.
- frollogaston
Ich dachte, NumPy würde die GIL bereits freigeben. Bei normalem, nicht-free-threaded Python kann man parallele NumPy-Operationen in Threads ausführen und mehrere Kerne zu 100 % auslasten, darauf habe ich mich verlassen. Vielleicht ist das bei den Operationen, auf die sich dieser Artikel konzentriert (sin/cos), nicht der Fall.
- tialaramex
> nur dann die Sperre erwerben, wenn das Flag aktualisiert werden muss
Unklar, warum man die Sperre hier in diesem Fall noch braucht. Die Idee, dass dieses Flag zur Laufzeit aktualisiert werden kann und sich darauf auswirkt, wie die Software funktioniert, wenn es gesetzt ist, scheint mit der Idee zu kollidieren, dass wir keine Aktion ergreifen müssen, nachdem wir einen relaxed (d. h. nicht synchronisierenden) Load durchgeführt und gesehen haben, dass es zu einem früheren Zeitpunkt nicht gesetzt war.
Vielleicht gibt es etwas, das ich an diesen Interna nicht verstehe, was so einfach sein könnte wie: "Es ist nur ein Hinweis, also kein großes Problem, wenn wir nicht nachverfolgen, wann wir es tun sollten".