Intel Fortran Compiler: porady dotyczące optymalizacji przy kompilacji


21

Zacznę od mojego osobistego doświadczenia w naszym laboratorium. W ciągu 9 i 10 dni w ifort byliśmy dość agresywni w zakresie optymalizacji, kompilując z flagami -O3 i specyficznymi dla procesora (na przykład -xW -xSSE4.2). Ale zaczynając od ifort 11, zaczęliśmy zauważać:
1. pewne niespójności w wynikach (ponieważ semantyka nie została zachowana)
2. mniejsze zyski w porównaniu do -O2.

Tak więc obecnie zwykle po prostu kompilujemy z -O2 i -xhost. Czy masz lepsze sugestie dotyczące ifort 11? Czy zmieni się to ponownie, gdy przejdziemy do ifort 12? Z góry dziękuję.


7
Optymalizacje nie przynoszą korzyści wszystkim kodom w jednakowy sposób. Dlatego myślę, że lepszym pytaniem byłoby: „W jaki sposób mogę profilować mój kod, aby stwierdzić, które optymalizacje kompilatora są skuteczne?”
Matt Knepley,

1
Ponieważ semantyka nie została zachowana lub dlatego, że coś zostało zmienione? Może to trochę odbiegać od tematu, ale dobrze byłoby zobaczyć fragment kodu, który odtwarza problem. Może być tak, że coś zostało zmienione w sposób, który ci się nie podoba, ale kompilator uważa, że ​​powinno być w porządku. Z mojego doświadczenia wynika, że ​​Intel 12 lepiej radzi sobie z wektoryzacją niż którykolwiek z jego poprzedników, więc spodziewam się więcej zmian po przejściu na najnowszą.
Bill Barth

Myślałem, że powiedzenie, że semantyka nie została zachowana, było równoznaczne z zachowaniem porządku. W każdym razie zdaję sobie sprawę, że moje pytanie jest (również?) Ogólne i nie chciałem rozwodzić się nad szczegółami. Mieliśmy kilka problemów z Intel 10, niektóre były błędami kompilatora, a niektóre pozostały niewyjaśnione. Więc z 11, graliśmy bezpiecznie i jesteśmy zadowoleni z wydajności. Ale może gramy w to zbyt bezpiecznie i chciałem wiedzieć, czy społeczność ma jakieś rady.
FrenchKheldar,

Odpowiedzi:


16

Zdecydowanie zalecamy, aby wszyscy nasi użytkownicy zaczęli od -O3 -xHost -ipozarówno dla ifort 11, jak i ifort 12. Jeśli istnieją specjalne transformacje zmiennoprzecinkowe włączone przez O3, które wpływają na precyzję niektórych twoich obliczeń, możesz je wyłączyć za pomocą -fp-model precise -fp-model except(lub, bardziej drastycznie, -fp-model strict) zachowując inne optymalizacje, O3 włącza, takie jak blokowanie pętli dla pamięci podręcznej, scalanie i rozwijanie pętli oraz optymalizacje dostępu do pamięci.

Radziłbym wypróbować rzeczy z modelu zmiennoprzecinkowego na poszczególnych plikach i dowiedzieć się, gdzie to robi różnicę, zamiast wyłączać go globalnie; może to być około 15% wzrost prędkości, a chcesz być w stanie utrzymać to tam, gdzie nie wpływa to na twoje obliczenia. Jeśli nie masz pewności, gdzie wpływa to na precyzję, możesz grać z włączaniem i wyłączaniem flag modelu zmiennoprzecinkowego dla tych plików lub z trybami zaokrąglania .

Niedawno przeprowadziliśmy krótką rozmowę z naszymi użytkownikami na temat flag optymalizacji, koncentrując się na kompilatorach GNU i Intel dla x86; możesz zobaczyć slajdy z tej rozmowy tutaj .

Nawiasem mówiąc, skoro mówimy o wyborze flag optymalizacyjnych dla twojego kodu, od czasu do czasu warto również przyjrzeć się wynikowi -vec-report, aby zobaczyć, gdzie kompilator próbował wektoryzować pętlę, a nie mógł; czasami w pętli można wprowadzić niewielkie zmiany, które mogą spowodować wektoryzację (która może być przyspieszeniem 4x). Podobnie w przypadku bardziej ogólnego raportu -opt-report .


Podoba mi się twoja odpowiedź, ale wypróbowałem ją ponownie na jednym z naszych testów i -O3 -xhost -fp-model precise -fp-model exceptspowodowałem 30% spowolnienie . -vec-report
Spojrzę

2
Ponad -O2-xhost? To interesujące; to bardzo niezwykłe, ale może się zdarzyć. W takich przypadkach optymalizator robi coś, co ma dobry powód, aby sądzić, że poprawi prędkość, ale okazuje się, że pogorszy to sytuację. Zwykle w przypadku kodu naukowego, który ma dość prostą strukturę, tak się nie dzieje. W takich przypadkach optymalizacja za pomocą profilu - software.intel.com/sites/products/documentation/hpc/compilerpro/… - często może pomóc.

5

Pracuję dla firmy, która produkuje duże, wysoce techniczne aplikacje w Fortran z IFort - aplikacje są bardzo ważne pod względem wydajności, ponieważ szybkość (przy zachowaniu dokładności) jest głównym punktem sprzedaży.

Zawsze kompilujemy z -O3 i, o ile wiem, najważniejsze rzeczy, które -O3 robią to rozwijanie pętli i pobieranie wstępne. Podejrzewam, że większość naukowych aplikacji komputerowych czerpie z nich ogromne korzyści, w szczególności optymalizacje pętli. Długo nie widzieliśmy błędów kompilatora (choć widzieliśmy kilka błędów linkera podczas korzystania z Ifort na Macu). Używamy 11.1.095.

Mam nadzieję, że to pomoże.


4

Zdaję sobie sprawę, że ta odpowiedź jest prawdopodobnie zdecydowanie za późna, ale w przypadku agresywnej optymalizacji opcja „-szybka” wydaje się najłatwiejszym rozwiązaniem. Fragmenty strony man:

-fast
    Maximizes speed across the entire program.
    Description:
    This option maximizes speed across the entire program.

    It sets the following options:
     - On Linux* systems: -ipo, -O3, -no-prec-div, -static, and -xHost
     - On OS X* systems: -ipo, -mdynamic-no-pic, -O3, -no-prec-div, and -xHost
     - On Windows*  systems:  /O3,  /Qipo,  /Qprec-div-,  and /QxHost

    NOTE: Option fast sets some aggressive optimizations that may not be appropriate for all
    applications. The resulting executable may not run on processor types different from the
    one on which you compile. You should make sure that you understand the individual optimi-
    zation options that are enabled by option fast.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.