DeepMind malferma kodo S6, bibliotekoj kun JIT-kompila efektivigo por CPython

DeepMind, konata pro siaj evoluoj en la kampo de artefarita inteligenteco, malfermis la fontkodon de la projekto S6, kiu evoluigis JIT-kompililon por la lingvo Python. La projekto estas interesa ĉar ĝi estas desegnita kiel etenda biblioteko kiu integriĝas kun norma CPython, certigante plenan kongruon kun CPython kaj ne postulante modifon de la interpretistokodo. La projekto disvolviĝas ekde 2019, sed bedaŭrinde ĝi estis ĉesigita kaj ne plu disvolviĝas. Ĉar la evoluoj kreitaj povas esti utilaj por plibonigi Python, oni decidis malfermi la kodon. La JIT-kompilkodo estas skribita en C++ kaj estas bazita sur CPython 3.7. kaj estas malfermfonta laŭ la permesilo Apache 2.0.

Koncerne la taskojn kiujn ĝi povas solvi, S6 por Python komparas kun la V8-motoro por JavaScript. La biblioteko anstataŭigas la ekzistantan bajtkodan interpretistotraktilon ceval.c kun sia propra efektivigo kiu uzas JIT-kompilon por akceli ekzekuton. S6 kontrolas ĉu la nuna funkcio jam estas kompilita kaj, se jes, efektivigas la kompilitan kodon, kaj se ne, rulas la funkcion en bajtokoda interpreta reĝimo, simile al la CPython-interpretilo. Dum interpretado, la nombro da efektivigitaj instrukcioj kaj vokoj asociitaj kun la funkcio estanta prilaborita estas nombrita. Post atingi certan mejloŝtonon, kompila procezo estas komencita por akceli ofte efektivigitan kodon. Kompilo estas farita en meza strongjit-reprezentantaro, kiu, post optimumigo, estas konvertita en maŝininstrukciojn de la celsistemo uzante la asmjit-bibliotekon.

Depende de la naturo de la laborkvanto, S6 sub optimumaj kondiĉoj montras pliiĝon en testa ekzekutrapideco de ĝis 9.5 fojojn kompare kun regula CPython. Dum rulado de 100 ripetoj de la Richards-testaro, 7x-rapideco estas observita, kaj dum rulado de la Raytrace-testo, kiu implikas grandan kvanton da matematikaj kalkuloj, 3-4.5x-rapideco estas observita.

Inter la taskoj malfacile optimumeblaj uzante S6 estas projektoj, kiuj uzas la C API, kiel NumPy, kaj ankaŭ operacioj asociitaj kun la bezono kontroli la tipojn de granda nombro da valoroj. Malalta rendimento ankaŭ estas observita por ununuraj vokoj de rimedintensaj funkcioj pro la uzo de la propra neoptimumigita efektivigo de S6 de la Python-interpretilo (la evoluo ne atingis la stadion de optimumigado de la interpreta reĝimo). Ekzemple, en la Unpack Sequence-testo, kiu malpakigas grandajn arojn da tabeloj/opoj, kun ununura voko estas malrapidiĝo de ĝis 5 fojojn, kaj kun cikla voko la rendimento estas 0.97 de CPython.

fonto: opennet.ru

Aldoni komenton