2017-07-08 9 views
7

Cyt z https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html:Dlaczego GCC miałby włączyć optymalizację w O2/O3, gdy wyraźnie mówi, że spowolni to program?

-falign oznakowań

-falign oznakowań = N

Wyrównywanie wszystkie cele gałęzi do granicy energii dwójki, pomijając do n bajtów, jak - funkcje falign. Ta opcja może z łatwością spowodować, że kod będzie wolniejszy, ponieważ musi wstawiać operacje pozorne, gdy docelowy numer rozgałęzienia zostanie osiągnięty w zwykłym przepływie kodu.

-fno-align-labels i -falign-labels = 1 są równoważne i oznaczają, że etykiety nie są wyrównane.

Jeśli -falign-loops lub -falign-jumps mają zastosowanie i są większe niż tej wartości, to zamiast nich używane są ich wartości.

Jeśli n nie jest określone lub wynosi zero, użyj domyślnej maszyny , która najprawdopodobniej ma wartość "1", co oznacza brak wyrównania.

Włączone na poziomach -O2, -O3.

Myśląc o tej flagi bardziej czyni go stracić nawet więcej sensu ... są konsekwencje prowokując kodu cache panienko, i jakie środki umożliwiające nawet gdy parametr przyjmuje wartość liczbową (1 ..)?

+1

„Jeśli n nie jest określona lub jest zerem, użyj domyślnego urządzenia zależne co jest bardzo prawdopodobne, aby być«1», co oznacza brak wyrównania.” Domyślnie gcc używa wartości zależnej od maszyny – Justin

+1

IIRC, jest to optymalizacja rozmiaru. – stybl

+1

To interesujące pytanie; dzięki za publikację. –

Odpowiedz

5

To nie mówi tego. Mówi, że może z łatwością uczynić kod wolniejszym. Oznacza to, że w pewnych sytuacjach może on spowolnić kod. W innych sytuacjach może przyspieszyć kod.

Wyrównanie powoduje uruchomienie kodu wolniejsze:

  • zwiększa rozmiar kodu, więc jest większa szansa, że ​​kod nie jest w pamięci podręcznej.
  • dodany nop operacji spowolnić kodu

Wyrównanie może spowodować uruchomienie kodu szybciej branch przewidywania, pobierania instrukcji i Bóg wie co jeszcze.

W przypadku pojedynczego if trudno powiedzieć, który efekt jest silniejszy. To zależy od warunków.

Jednak w przypadku pętli zwykle kod staje się szybszy. Czemu? Ponieważ powolne czynniki zdarzają się tylko raz, ale każdy cykl pętli zostanie wykonany szybciej.

(My GCC wydaje się wyrównać etykiety do 8)

Powiązane problemy