W ramach projektu badawczego rozpoczęto pracę nad dodaniem do GCC możliwości, która pozwala na podział procesu kompilacji na kilka równolegle wykonujących się wątków. Obecnie, aby zwiększyć szybkość kompilacji na systemach wielordzeniowych, na poziomie narzędzia make stosuje się uruchamianie oddzielnych procesów kompilatora, z których każdy wykonuje kompilację osobnego pliku z kodem. Nowy projekt eksperymentuje z zapewnieniem równoległości na poziomie kompilatora, co potencjalnie pozwoli zwiększyć efektywność pracy na systemach wielordzeniowych.
Do testowania oddzielną gałąź GCC do równoleglenia, dla której zaproponowano nowy parametr „—param=num-threads=N” do określenia liczby wątków. Na początkowym etapie wdrożono wydzielenie do oddzielnych wątków optymalizacji międzyproceduralnych, które są cyklicznie wywoływane dla każdej funkcji i dobrze poddają się równolegleniu. W oddzielnych wątkach wydzielono operacje GIMPLE, odpowiedzialne za niezależne od sprzętu optymalizacje, oceniające interakcje funkcji między sobą.
Na następnym etapie planuje się również wydzielenie międzyproceduralnych optymalizacji RTL do oddzielnych wątków, uwzględniających cechy platformy sprzętowej. Po tym planuje się zrealizowanie równoleglenia wewnątrzproceduralnych optymalizacji (IPA), stosowanych do kodu wewnątrz funkcji, niezależnie od szczegółów wywołania. Ograniczającym czynnikiem jest na razie zbieracz śmieci, do którego dodano globalną blokadę wyłączającą operacje zbierania śmieci podczas pracy w trybie wielowątkowym (w przyszłości zbieracz śmieci zostanie dostosowany do wielowątkowego wykonania GCC).
Aby ocenić zmiany w wydajności, przygotowano zestaw testów, realizujących kompilację pliku gimple-match.c, zawierającego ponad 100 tysięcy linii kodu i 1700 funkcji. Testy na systemie z procesorem Intel Core i5-8250U z 4 fizycznymi rdzeniami i 8 wirtualnymi (Hyperthreading) wykazały zmniejszenie czasu realizacji optymalizacji Intra Procedural GIMPLE z 7 do 4 sekund przy uruchomieniu 2 wątków oraz do 3 sekund przy uruchomieniu 4 wątków, co oznacza wzrost szybkości rozpatrywanego etapu kompilacji odpowiednio o 1.72 i 2.52 razy. Testy wykazały również, że użycie rdzeni wirtualnych przy Hyperthreading nie prowadzi do wzrostu wydajności.

Całkowity czas kompilacji skrócił się o około 10%, jednak prognozy wskazują, że równoległe optymalizacje RTL przyniosą bardziej wymierne rezultaty, ponieważ ten etap zajmuje znacznie więcej czasu podczas kompilacji. Szacunkowo po równoległym przetwarzaniu RTL całkowity czas kompilacji skróci się w 1,61 raza. Dodatkowo, jeszcze o 5-10% można zredukować czas kompilacji dzięki równoległemu przetwarzaniu optymalizacji IPA.

Źródło: opennet.ru
