Η DeepMind, μια εταιρεία γνωστή για τις εξελίξεις της στον τομέα της τεχνητής νοημοσύνης, άνοιξε τον πηγαίο κώδικα του έργου S6, το οποίο ανέπτυξε έναν μεταγλωττιστή JIT για τη γλώσσα Python. Το έργο είναι ενδιαφέρον στο σχεδιασμό του ως βιβλιοθήκη επέκτασης που ενσωματώνεται με το πρότυπο CPython, παρέχοντας πλήρη συμβατότητα με το CPython και δεν απαιτεί τροποποίηση του κώδικα διερμηνέα. Το έργο αναπτύσσεται από το 2019, αλλά δυστυχώς περιορίστηκε και δεν αναπτύσσεται πλέον. Δεδομένου ότι οι εξελίξεις που δημιουργήθηκαν μπορεί να είναι χρήσιμες για τη βελτίωση της Python, αποφασίστηκε να ανοιχτεί ο πηγαίος κώδικας. Ο κώδικας μεταγλωττιστή JIT είναι γραμμένος σε C++, βασισμένος στο CPython 3.7 και είναι ανοιχτός με την άδεια Apache 2.0.
Όσον αφορά τις εργασίες που επιλύει, το S6 για Python συγκρίνεται με τη μηχανή V8 για JavaScript. Η βιβλιοθήκη αντικαθιστά τον υπάρχοντα χειριστή διερμηνέα bytecode ceval.c με τη δική της υλοποίηση που χρησιμοποιεί μεταγλώττιση JIT για επιτάχυνση της εκτέλεσης. Το S6 ελέγχει εάν η τρέχουσα συνάρτηση έχει ήδη μεταγλωττιστεί και, εάν ναι, εκτελεί τον μεταγλωττισμένο κώδικα και, εάν όχι, εκτελεί τη συνάρτηση σε λειτουργία ερμηνείας bytecode, παρόμοια με τον διερμηνέα CPython. Κατά τη διάρκεια της ερμηνείας, μετράται ο αριθμός των εκτελεσμένων εντολών και των κλήσεων που σχετίζονται με την επεξεργασμένη συνάρτηση. Μετά την επίτευξη ενός συγκεκριμένου ορίου, ξεκινά η διαδικασία μεταγλώττισης για την επιτάχυνση του συχνά εκτελούμενου κώδικα. Η μεταγλώττιση εκτελείται στην ενδιάμεση αναπαράσταση strongjit, η οποία, μετά τη βελτιστοποίηση, μετατρέπεται σε εντολές μηχανής του συστήματος-στόχου χρησιμοποιώντας τη βιβλιοθήκη asmjit.
Ανάλογα με τη φύση του φορτίου, το S6 επιδεικνύει έως και 9.5 φορές μεγαλύτερη ταχύτητα εκτέλεσης της δοκιμής υπό βέλτιστες συνθήκες σε σύγκριση με το κανονικό CPython. Κατά την εκτέλεση 100 επαναλήψεων της σουίτας δοκιμών Richards, παρατηρείται επιτάχυνση 7 φορές, και κατά την εκτέλεση της δοκιμής Raytrace, η οποία περιέχει μεγάλο αριθμό μαθηματικών υπολογισμών, παρατηρείται επιτάχυνση 3-4.5 φορές.
Μεταξύ των εργασιών που είναι δύσκολο να βελτιστοποιηθούν με το S6 είναι έργα που χρησιμοποιούν το C API, όπως το NumPy, και λειτουργίες που απαιτούν έλεγχο των τύπων ενός μεγάλου αριθμού τιμών. Χαμηλή απόδοση παρατηρείται επίσης για μεμονωμένες κλήσεις συναρτήσεων που απαιτούν πολλούς πόρους λόγω της χρήσης της δικής του μη βελτιστοποιημένης υλοποίησης του διερμηνέα Python από το S6 (η ανάπτυξη δεν έχει φτάσει στο στάδιο της βελτιστοποίησης της λειτουργίας ερμηνείας). Για παράδειγμα, στη δοκιμή Unpack Sequence, η οποία αποσυμπιέζει μεγάλα σύνολα πινάκων/πλειάδων, μια μεμονωμένη κλήση επιβραδύνεται έως και 5 φορές, και με μια κυκλική κλήση, η απόδοση είναι 0.97 της CPython.
Πηγή: opennet.ru
