Kiedy mogę śmiało skompilować program za pomocą -O3?

Widziałem wielu ludzi narzekających na opcję -O3:

GCC: program nie działa z opcją kompilacji -O3

Problem zmiennoprzecinkowy dostarczony przez Davida Hammen

Sprawdzam podręcznik z GCC:

   -O3    Optimize yet more.  -O3 turns on all optimizations
          specified   by   -O2   and   also   turns  on  the
          -finline-functions and -frename-registers options.

Potwierdziłem także kod, aby upewnić się, że dwie opcje są jedynymi dwiema optymalizacjami zawartymi w -O3:

if (optimize >= 3){
    flag_inline_functions = 1;
    flag_rename_registers = 1;
}

Dla tych dwóch optymalizacji:

-finline-funkcje jest przydatny w niektórych przypadkach (głównie w C ++), ponieważ pozwala nam zdefiniować rozmiar wbudowanych funkcji (domyślnie 600) z -finline-limit. Kompilator może zgłosić błąd narzekający na brak pamięci po ustawieniu wysokiego limitu inline.

-frename-rejestry próbuje uniknąć fałszywych zależności w zaplanowanym kodzie, korzystając z rejestrów pozostałych po przydzieleniu rejestru. Ta optymalizacja przyniesie największe korzyści procesorom z wieloma rejestrami.

Dla funkcji wbudowanych, chociaż może zmniejszyć liczbę wywołań funkcji, ale może to prowadzić do dużych plików binarnych, więc funkcje -finline mogą wprowadzać surowe kary cache i stają się nawet wolniejsze niż -O2. Myślę, że kary cache nie tylko zależą od samego programu.

Dla rejestrów zmian nazw nie sądzę, aby miało to jakikolwiek pozytywny wpływ na architekturę cisc, taką jak x86.

Moje pytanie ma 2,5 części:

[Answerd] 1. Czy mam rację twierdząc, że program może działać szybciej z opcją -O3 zależy od platformy / architektury?

EDYCJA: Pierwsza część została potwierdzona jako prawdziwa. David Hammen twierdzi również, że powinniśmy być bardzo ostrożni w kwestii interakcji optymalizacji i operacji zmiennoprzecinkowych na maszynach z rozszerzonymi rejestrami zmiennoprzecinkowymi, takimi jak Intel i AMD.

2.Kiedy mogę śmiało używać opcji -O3? Przypuszczam, że te dwie optymalizacje, zwłaszcza rejestry zmiany nazwy, mogą prowadzić do różnych zachowań od -O0 / O2. Widziałem, jak niektóre programy skompilowane z -O3 uległy awarii podczas wykonywania, czy jest to deterministyczne? Jeśli uruchomię plik wykonywalny raz bez awarii, czy oznacza to, że można bezpiecznie używać -O3?

EDYCJA: Deterministyczność nie ma nic wspólnego z optymalizacją, jest to problem wielowątkowości. Jednak w przypadku programu wielowątkowego używanie -O3 nie jest bezpieczne, gdy uruchamiamy plik wykonywalny bez błędów. David Hammen pokazuje, że optymalizacja O3 w operacjach zmiennoprzecinkowych może naruszyć ścisłe kryterium porządkowania dla porównania.Czy istnieje jakakolwiek inna obawa, którą musimy zachować ostrożność, gdy chcemy użyć opcji -O3?

[Odpowiedź] 3. Jeśli odpowiedź na pierwsze pytanie brzmi „tak”, to kiedy zmieniam platformę docelową lub system rozproszony z różnymi maszynami, może być konieczna zmiana między -O3 i -O2. Czy są jakieś ogólne sposoby decydowania, czy mogę uzyskać poprawę wydajności przy użyciu -O3? Na przykład więcej rejestrów, krótkie funkcje wbudowane itp.

EDYCJA: Louen odpowiedział na trzecią część: „Różnorodność platform uniemożliwia ogólne rozumowanie tego problemu” Podczas oceny przyrostu wydajności o -O3, musimy wypróbować go z obu i przetestować nasz kod, aby zobaczyć, który jest szybszy.

questionAnswers(2)

yourAnswerToTheQuestion