Nell'ambito di un progetto di ricerca è iniziato il lavoro per aggiungere a GCC la possibilità di suddividere il processo di compilazione in più thread eseguiti in parallelo. Attualmente, per aumentare la velocità di compilazione nei sistemi multi-core, viene avviato un processo separato del compilatore per ogni file di codice da compilare a livello dell'utility make. Il nuovo progetto sperimenta con la paralellizzazione a livello del compilatore, il che potrebbe aumentare l'efficienza operativa sui sistemi multi-core.
Per il testing un ramo separato per la paralellizzazione di GCC, per il quale è stato proposto un nuovo parametro «—param=num-threads=N» per specificare il numero di thread. Nella fase iniziale è stata implementata l’estrazione in thread separati delle ottimizzazioni interprocedurali, che vengono richiamate ciclicamente per ciascuna funzione e ben si prestano alla paralellizzazione. Sono state estratte in thread separati le operazioni GIMPLE, responsabili delle ottimizzazioni indipendenti dall'hardware che valutano le interazioni tra funzioni.
Nella fase successiva si prevede di estrarre in thread separati anche le ottimizzazioni RTL interprocedurali, tenendo conto delle caratteristiche della piattaforma hardware. Dopo ciò, si intende implementare la paralellizzazione delle ottimizzazioni intra-procedurali (IPA) applicate al codice all'interno della funzione, indipendentemente dalle peculiarità della chiamata. Il collo di bottiglia attuale è rappresentato dal garbage collector, al quale è stata aggiunta una global lock che disabilita le operazioni di pulizia durante il funzionamento in modalità multi-threading (in futuro il garbage collector sarà adattato per l'esecuzione multi-threading di GCC).
Per valutare le variazioni delle prestazioni, è stato preparato un set di test che esegue la compilazione del file gimple-match.c, contenente oltre 100.000 righe di codice e 1.700 funzioni. I test su un sistema con CPU Intel Core i5-8250U con 4 core fisici e 8 virtuali (Hyperthreading) hanno mostrato una riduzione del tempo necessario per l'ottimizzazione Intra Procedural GIMPLE da 7 a 4 secondi con l'esecuzione di 2 thread e a 3 secondi con 4 thread, raggiungendo quindi un aumento della velocità di questo stadio di compilazione di 1,72 e 2,52 volte, rispettivamente. I test hanno anche mostrato che l'uso di core virtuali con Hyperthreading non porta a un aumento delle prestazioni.

Il tempo totale di compilazione è stato ridotto di circa il 10%, ma si prevede che il parallelismo delle ottimizzazioni RTL porterà risultati più significativi, poiché questa fase richiede sostanzialmente più tempo durante la compilazione. Si stima che, dopo il parallelismo RTL, il tempo totale di compilazione sarà ridotto di 1,61 volte. Successivamente, si potrà ridurre ulteriormente il tempo di compilazione del 5-10% grazie al parallelismo delle ottimizzazioni IPA.

Fonte: opennet.ru
