Liczba wątków a czas kompilacji, krótki test

W tym inauguracyjnym wpisie chciałbym poruszyć temat liczby wątków i jej wpływu na szybkość kompilacji w języku C++.

Na szybkość kompilacji będzie miało wpływ parę czynników są to m.in:

  • Przede wszystkim liczba rdzeni i wątków dostępnych w systemie,
  • Pojemność i szybkość pamięci(dysków twardych i pamięci ram),
  • Zastosowany kompilator,
  • Konstrukcja oprogramowania, zazwyczaj kompilowanie to zadanie które zwielokrotnia się łatwo, aczkolwiek zdarzają się przypadki kiedy trzeba zmniejszyć liczbę wątków na jakich budujemy aplikację lub co więcej wymuszana jest liczba wątków.

W niniejszym teście kompilacji będą podlegać dwa programy:

  • Gnumeric 1.12.30, kompilacja programu,
  • Ogre3d 1.10.10, kompilacja wszystkich przykładów.

Zastosowany kompilator to gcc 7.2 na Debianie 9 stretch.

Do dyspozycji mamy dwie jednostki:

Konfiguracja pierwsza:

  1. AMD ryzen 1700, 8 rdzeni i 16 wątków.
  2. 16 gb ram 2400 mhz.
  3. Dysk ssd Crucial mx 300

Konfiguracja druga:

  1. I-7 5500U, 2 rdzenie i 4 wątki
  2. 8 Gb ram
  3. SSD Plextro m7vc

Wyniki

Wnioski

Myślę że w teście gnumeric nie ma zaskoczenia. W przypadku konfiguracji pierwszej największe wzrosty notujemy kiedy mamy w zanadrzu jeszcze rdzenie fizyczne, później gdy nie mamy samych rdzeni fizycznych a dodatkowe wątki(w tym wypadku SMT) wzrosty są dużo mniejsze.

W przypadku konfiguracji II mamy tylko 2 rdzenie i wzrost z dwóch do czterech wątków pomaga niewiele. Próba dodania większej liczby wątków na cpu z czterema wątkami nie zmienia niczego. Sam procesor nie jest demonem prędkości co należy mieć także na uwadze (możliwy boost zegarów, ilość pamięci L1,L2 czy L3 itd.)

Wyniki w ogre3d są nieco ciekawsze. W tym wypadku budujemy więcej niż jedną binarkę(budujemy wszystkie przykłady ogre). W przypadku konfiguracji I w zasadzie wyniki i komentarz jest taki sam jak w poprzednim przypadku.

Konfiguracja II jest tu ciekawsza pod tym względem, że jeśli zwiększamy liczbę wątków ponad obsługiwane czas kompilacji rośnie. Pamiętajmy podczas budowania mocno obciążamy wszystkie pod systemy, samo przełączanie dużej liczby wątków(kontekstu) daje już pewien narzut. W tym przypadku dodatkowe wątki okazały się wręcz szkodliwe.

Dodam jeszcze że kiedyś wykonywałem test na konfiguracji I dla innego oprogramowania przy konfiguracji 8 wątków vs 16 wątków podczas budowania. W przypadku tamtej aplikacji z około 65 sekund udało zejść się do 49 s. Co jest zmianą istotną. Należy mieć to na uwadze.

Słowem podsumowania, podczas procesu budowania nie warto przekraczać dostępnej puli rdzeni/wątków lub jak mówi stara rada n+1 gdzie n to liczba dostępnych rdzeni/wątków.