Co to jest FLOP/S i czy jest to dobra miara wydajności?

Poproszono mnie o pomiar wydajności programu fortran, który rozwiązuje równania różniczkowe w systemie wielordzeniowym. Mój pracodawca nalega, aby zmierzyć FLOP/s (Floating operacji na sekundę) i porównać wyniki z benchmarkami (LINPACK), ale nie jestem przekonany, że jest to sposób, aby przejść, po prostu dlatego, że nikt nie może mi wyjaśnić, co FLOP jest.

Zrobiłem trochę badań na czym dokładnie FLOP jest i mam kilka dość sprzeczne odpowiedzi. Jeden z najpopularniejszych odpowiedzi dostałem było "1 FLOP = dodawanie i mnożenie operacji". To prawda? Jeśli tak, to jeszcze raz, fizycznie, co to dokładnie oznacza?

Niezależnie od metody, której używam, musi być skalowalna. Niektóre wersje kodu rozwiązują systemy z wieloma milionami niewiadomych i ich wykonanie zajmuje kilka dni.

Jakie byłyby inne, skuteczne sposoby mierzenia wydajności w moim przypadku (podsumowanie mojego przypadku to ' kod fortran, który wykonuje wiele obliczeń arytmetycznych w kółko znowu przez kilka dni na kilkuset procesorach)?

Author: osgx, 2008-11-30

8 answers

To całkiem przyzwoita miara wydajności, o ile dokładnie rozumiesz, co mierzy.

FLOPS to, jak sama nazwa wskazuje, operacje zmiennoprzecinkowe na sekundę, dokładnie to, co stanowi FLOP, może różnić się w zależności od procesora. (Niektóre procesory mogą wykonywać dodawanie i mnożenie jako jedną operację, inne nie mogą, na przykład). Oznacza to, że jako miara wydajności jest dość blisko sprzętu, co oznacza, że 1) musisz znać swój sprzęt, aby obliczyć idealne flopy na biorąc pod uwagę architekturę, musisz znać swój algorytm i implementację, aby dowiedzieć się, z ilu operacji zmiennoprzecinkowych faktycznie się składa.

W każdym razie jest to przydatne narzędzie do sprawdzania, jak dobrze wykorzystujesz procesor. Jeśli znasz teoretyczną maksymalną wydajność procesora we flopach, możesz określić, jak wydajnie używasz jednostek zmiennoprzecinkowych procesora, które często są jedną z trudnych do efektywnego wykorzystania. Program, który uruchamia 30% flopów, do których jest zdolny procesor, ma miejsce na optymalizacja. Taki, który działa na poziomie 70%, prawdopodobnie nie będzie znacznie bardziej wydajny, chyba że zmienisz podstawowy algorytm. W przypadku ciężkich algorytmów matematycznych, takich jak twój, jest to standardowy sposób pomiaru wydajności. Można po prostu zmierzyć, jak długo program trwa, ale to bardzo różni się w zależności od procesora. Ale jeśli twój program ma 50% wykorzystania procesora (w stosunku do szczytowej liczby flopów), jest to nieco bardziej stała wartość (nadal będzie się różnić między radykalnie różnymi procesorami architektury, ale jest o wiele bardziej spójny niż czas wykonania).

Ale świadomość, że "mój procesor jest zdolny do X GFLOPS, a w rzeczywistości osiągam tylko przepustowość powiedzmy 20% tego", jestbardzo cenną informacją w wysokowydajnym oprogramowaniu. Oznacza to, że coś innego niż operacje zmiennoprzecinkowe powstrzymuje cię i uniemożliwia efektywną pracę jednostek FP. A ponieważ jednostki FP stanowią większość pracy, oznacza to, że Twoje oprogramowanie ma problem.

Łatwo jest zmierzyć "mój program działa w ciągu X minut", a jeśli uważasz, że jest to nie do przyjęcia, możesz śmiało powiedzieć "zastanawiam się, czy mogę odciąć 30% od tego", ale nie wiesz wiesz czy jest to możliwe, chyba że dowiesz się dokładnie, ile pracy jest wykonywana i do czego jest zdolny procesor w szczycie. Ile czasu chcesz poświęcić na optymalizację, jeśli nawet nie wiesz, czy procesor jest zasadniczo w stanie uruchomić więcej instrukcji na sekundę?

Bardzo łatwo jest zapobiec efektywnemu wykorzystaniu jednostki FP procesora, poprzez zbyt wiele zależności między operacjami FP lub zbyt wiele gałęzi lub podobnych, uniemożliwiając efektywne planowanie. Jeśli to powstrzymuje Twoją realizację, musisz to wiedzieć. Musisz wiedzieć, że " nie uzyskuję przepustowości FP, która powinna być możliwa, więc najwyraźniej Inne części mojego kodu uniemożliwiają udostępnienie instrukcji FP, gdy procesor jest gotowy do Wydanie pierwsze".

Po co ci inne sposoby mierzenia wydajności? Co jest złego w tym, że po prostu ustalasz liczbę flopów tak, jak prosił cię twój szef? ;)

 46
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-30 20:44:55

Chciałbym tylko dodać kilka drobniejszych punktów:

  • Podział {[6] } jest wyjątkowy. Ponieważ większość procesorów może wykonać dodawanie, porównywanie lub mnożenie w jednym cyklu, wszystkie są liczone jako jeden flop. Ale podział zawsze trwa dłużej. Ile jeszcze zależy od procesora, ale w społeczności HPC istnieje pewien standard defacto, który liczy jedną dywizję jako 4 flopy.

  • Jeśli procesor posiada fused multiply-add instruction that do mnożenie i dodawanie w pojedynczej instrukcji -- ogólnie A + = B * C -- które liczą się jako 2 operacje.

  • Zawsze należy uważać przy rozróżnianiu flopów z pojedynczą precyzją i z podwójną precyzją. Procesor, który jest zdolny do tak wielu pojedynczo precyzyjnych gigaflopów, może być zdolny tylko do niewielkiego ułamka z tak wielu podwójnych precyzyjnych gigaflopów. Procesory AMD Athlon i Phenom mogą na ogół wykonać o połowę mniej flopów z podwójną precyzją niż pojedyncze precyzja. Procesory ATI Firestream mogą na ogół wykonywać 1/5 tyle flopów z podwójną precyzją, co single precision. Jeśli ktoś próbuje sprzedać ci procesor lub pakiet oprogramowania i po prostu cytuje klapy, nie mówiąc którego, powinieneś zadzwonić do niego.

  • Terminy megaflop, gigaflop, teraflop itp. są w powszechnym użyciu. Odnoszą się one do czynników 1000, nie 1024 . Np. 1 megaflop = 1,000,000 flop/sek nie 1,048,576. Podobnie jak w przypadku rozmiarów dysków, jest pewne zamieszanie w tej sprawie.

 26
Author: Die in Sente,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-30 23:54:42

"porównaj wyniki z benchmarkami" i co zrobić?

FLOPS oznacza, że potrzebujesz

1) klapy na jakąś jednostkę pracy.

2) Czas na tę jednostkę pracy.

Załóżmy, że masz jakiś plik wejściowy, który wykonuje 1000 iteracji przez jakąś pętlę. Pętla jest poręczną jednostką pracy. Jest wykonywany tysiąc razy. To trwa godzinę.

Pętla ma kilka dodań i mnoży, kilka podziałów i pierwiastek kwadratowy. Możesz liczyć dodaje, mnoży i dzieli. Możesz policz to w źródle, szukając+, * i/. Możesz znaleźć wyjście języka asemblera z kompilatora i policzyć je tam. Możesz otrzymać różne liczby. Który jest dobry? Zapytaj swojego szefa.

Możesz policzyć pierwiastki kwadratowe, ale nie wiesz, co tak naprawdę robi pod względem mnożenia i dodawania. Więc, będziesz musiał zrobić coś takiego jak benchmark mnożenie vs. pierwiastek kwadratowy, aby dowiedzieć się, jak długo trwa pierwiastek kwadratowy.

Teraz znasz klapy w swojej pętli. Oraz wiesz, kiedy to zrobić 1000 razy. Wiesz FLOPS na sekundę.

Potem patrzysz na LINPACKA i widzisz, że jesteś wolniejszy. Co teraz? Twój program nie jest LINPACK, i jest wolniejszy niż LINPACK. Szanse są naprawdę dobre, że Twój kod będzie wolniejszy. Jeśli twój kod nie został napisany i zoptymalizowany przez tę samą liczbę lat co LINPACK, będziesz wolniejszy.

Oto druga część. Twój procesor ma określone oceny flopów w różnych benchmarkach. Twój algorytm nie jest jednym z tych benchmarki, więc nie spełniasz kryteriów. Czy to źle? A może jest to oczywistą konsekwencją nie bycia punktem odniesienia?

Jaki będzie efekt zaskarżenia?

Pomiar na podstawie kodu benchmarku powie Ci tylko, że algorytm nie jest algorytmem benchmarku. Jest to przesądzone, że będziesz inny; Zwykle wolniejszy.

Oczywiście wynik pomiaru względem LINPACKA będzie (a) różny i dlatego (b) musisz zoptymalizować.

Pomiar jest naprawdę cenny tylko wtedy, gdy jest wykonywany przeciwko sobie . Nie jakaś hipotetyczna mieszanka instrukcji, ale twoja własna mieszanka instrukcji. ZMIERZ SWOJE WYNIKI. Zmień to. Sprawdź, czy Twoje wyniki-w porównaniu z tobą-będą lepsze czy gorsze.

Klapki nie mają znaczenia. Liczy się czas na jednostkę pracy. Nigdy nie dopasujesz parametrów projektowych swojego sprzętu, ponieważ nie uruchamiasz testu porównawczego, który twój sprzęt projektanci oczekiwali.

LINPACK nie ma znaczenia. Liczy się baza kodu i zmiany, które wprowadzasz, aby zmienić wydajność.

 3
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-30 20:53:45

Stare pytanie ze starymi, jeśli popularnymi, odpowiedziami, które nie są do końca świetne, IMO.

"FLOP" jest operacją matematyczną zmiennoprzecinkową. "FLOPS" może oznaczać jedną z dwóch rzeczy:

  • prosta liczba mnoga "FLOP" (tj."operacja X zajmuje 50 flopów")
  • współczynnik flopów w pierwszym znaczeniu (tj. zmiennoprzecinkowych operacji matematycznych na sekundę)

Gdzie nie jest jasne z kontekstu, który z nich jest rozumiany jest często disambigated przez pisanie pierwszego jako "FLOPs", a ten ostatni jako "FLOP/s".

FLOPs są tak zwane, aby odróżnić je od innych rodzajów operacji CPU {18]}, takich jak operacje matematyczne liczb całkowitych, operacje logiczne, operacje bitowe, operacje pamięci i operacje rozgałęziające, które mają różne koszty (Czytaj "take different lengths of time") związane z nimi.

Praktyka "liczenia flopów" sięga bardzo wczesnych dni informatyki naukowej, kiedy Flopy były, relatywnie mówiąc, niezwykle kosztowne, biorąc wiele cykli procesora każdy. Na przykład koprocesor matematyczny 80387 pobierał około 300 cykli dla pojedynczego mnożenia. Było to w czasie przed pipeliningiem i zanim przepaść między taktowaniem procesora a szybkością pamięci naprawdę się otworzyła: operacje na pamięci trwały tylko jeden cykl lub dwa, a rozgałęzianie ("podejmowanie decyzji") było podobnie tanie. Wtedy, jeśli można wyeliminować jeden FLOP na rzecz tuzin dostęp do pamięci, można zrobić zysk. Jeśli można wyeliminować pojedynczy FLOP na rzecz kilkunastu oddziałów, można uzyskać zysk. Więc, w przeszłości, to miało sens, aby liczyć flopów i nie martwić się dużo o odwołania pamięci i gałęzie, ponieważ Flopy silnie zdominowały czas wykonania ponieważ były indywidualnie bardzo drogie w stosunku do innych rodzajów operacji.

Ostatnio sytuacja się odwróciła. FLOPs stały się bardzo tanie - każdy nowoczesny Intel core {[7] } może wykonać około dwóch flopów na cykl (choć podział pozostaje stosunkowo drogie) - a dostępy do pamięci i gałęzie są stosunkowo dużo droższe: cache L1 kosztuje może 3 lub 4 cykle, pobieranie z pamięci głównej kosztuje 150-200. Biorąc pod uwagę tę inwersję, nie jest już tak, że wyeliminowanie flopa na rzecz dostępu do pamięci spowoduje zysk ; w rzeczywistości jest to mało prawdopodobne. Podobnie, często tańsze jest "po prostu zrobić" FLOP, nawet jeśli jest to zbędne, zamiast decydować, czy to zrobić, czy nie. Jest to prawie całkowite przeciwieństwo sytuacja sprzed 25 lat.

Niestety, praktyka ślepego FLOPU-liczenia jako absolutnej metryki algorytmicznej zasługi utrzymała się dobrze po swojej dacie sprzedaży. Współczesne obliczenia naukowe znacznie bardziej koncentrują się na zarządzaniu przepustowością pamięci - starając się utrzymać jednostki wykonawcze, które wykonują Flopy stale zasilane danymi - niż na zmniejszaniu liczby flopów. Nawiązanie do LINPACK (który został zasadniczo przestarzały przez LAPACK 20 lat temu) prowadzi mnie do podejrzeń, że twój pracodawca jest prawdopodobnie z bardzo starej szkoły, która nie zinternalizowała faktu, że ustalanie oczekiwań dotyczących wydajności nie jest już tylko kwestią FLOPU. Rozwiązanie, które wykonuje dwa razy więcej flopów, nadal może być dwadzieścia razy szybsze niż inne, jeśli ma znacznie korzystniejszy wzór dostępu do pamięci i układ danych.

Efektem tego wszystkiego jest to, że ocena wydajności oprogramowania intensywnego obliczeniowo stała się o wiele bardziej złożona niż kiedyś to było . Fakt, że Flopy stały się Tanie, jest ogromnie skomplikowany przez ogromną zmienność w kosztach operacji pamięci i gałęzi. Jeśli chodzi o ocenę algorytmów , proste liczenie flopów po prostu nie wpływa na ogólne oczekiwania dotyczące wydajności.

Być może lepszy sposób myślenia o oczekiwaniach i ocenie wydajności zapewnia tzw. model linii dachowej , który jest daleki od doskonałości, ale ma tę zaletę pozwala to na uzyskanie bardziej pouczającego i wnikliwego "obrazu 2D", który umożliwia porównanie pomiarów wydajności i oczekiwań wydajności.

Warto zajrzeć.

 2
Author: Emmet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-01 23:33:32

FLOPS jest, jak powiedziałeś, operacją zmiennoprzecinkową na sekundę. Na przykład, jeśli poświęcisz dokładnie jedną sekundę na operację (np. Dodanie, Odejmowanie, Mnożenie lub dzielenie dwóch wartości i zwrócenie wyniku), twoja wydajność wynosi po prostu 1 FLOPS. Najnowszy procesor z łatwością osiągnie kilka Gigaflopów, czyli kilka miliardów operacji zmiennoprzecinkowych na sekundę.

 1
Author: Sören Kuklau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-30 18:51:37

Po prostu starałbym się, aby poszło tak szybko, jak to możliwe, a to wymaga sprawdzenia, gdzie spędza czas, zwłaszcza jeśli istnieją wywołania funkcji, których można uniknąć.

Robię to prostą metodą, po prostu przerywając go kilka razy, gdy jest uruchomiony, i widząc, co robi. Oto rodzaje rzeczy, które znajduję:

  • Większość czasu jest w procesie obliczania pochodnej i / lub Jakobiańskiej. Wiele z tego czasu można przejść do funkcji matematycznych takie jak exp(), log(), i sqrt(). Często są one powtarzane z identycznymi argumentami i mogą być notowane. (Massive speedup.)

  • Większość czasu poświęca się na obliczanie pochodnych zbyt wiele razy, ponieważ tolerancje całkowania są ciaśniejsze niż jest to konieczne.

  • Jeśli algorytm integracji ukrytej (taki jak DLSODE Gear) jest używany, ponieważ równania są uważane za sztywne, są szanse, że nie są, i coś takiego jak Runge-Kutta może być używany. DVERK).

  • Możliwe, że algorytm macierzy wykładniczej może być użyty, jeśli model jest liniowy (DGPADM). Jest to duże zwycięstwo zarówno pod względem wydajności, jak i precyzji, i jest odporny na sztywność. (O wiele szybciej)

  • Wyżej w górę stosu wywołań może być tak, że te same integracje są wykonywane wielokrotnie z nieco innymi parametrami, tak aby określić gradient przedniej lub centralnej różnicy rozwiązania w odniesieniu do tych parametrów. Jeśli Równania różniczkowe są same różniczkowalne, może być możliwe, aby uzyskać te gradienty analitycznie, lub poprzez zwiększenie równań z równaniami czułości. Jest to nie tylko znacznie szybsze, ale znacznie bardziej precyzyjne, co może przyspieszyć rzeczy jeszcze wyżej w stosie.

Możesz spojrzeć na każdy poziom stosu jako okazję do znalezienia rzeczy do optymalizacji, a przyspieszenie się połączy. Następnie, gdy przejdziesz do multi-cpu, zakładając, że jest równoległy, powinien zapewnić jego własny mnożnik.

Więc wracamy do flopów. Możesz spróbować zmaksymalizować FLOPs / second, ale może być również znacznie bardziej przydatne minimalizować FLOPs / run, poprzez optymalizację na wszystkich poziomach stosu. W każdym razie, po prostu pomiar nie mówi prawie nic.
 1
Author: Mike Dunlavey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-06 18:14:08

Twój pracodawca ma rację.
Jedynym sposobem na zmierzenie skuteczności Twojego programu Fortran (lub jakiegokolwiek innego programu, btw) jest przetestowanie go pod kątem standardowych benchmarków, jeśli takie istnieją.

I, O flopach, oznacza "operacje zmiennoprzecinkowe na sekundę" - Zobacz definicję na Wikipedii.

 0
Author: Gabriele D'Antona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-30 18:52:19

Nie sądzę, aby pomiar flopów był bardzo przydatny.

Liczba uzyskanych flopów powie Ci, jak zajęty algorytm utrzymuje procesor, ale nie powie Ci, jak dobrze działa sam algorytm.

Możesz znaleźć dwa różne algorytmy, które powodują, że procesor wykonuje tę samą liczbę flopów, ale jeden zapewnia pożądany wynik w połowie czasu.

Myślę, że lepiej byłoby spojrzeć na znacznie "wyższy poziom" statystyki, takie jak liczba Równania różniczkowe rozwiązywane na jednostkę czasu (to przecież cel Twojego algorytmu).

Z drugiej strony, pomiar liczby uzyskanych flopów może pomóc w ulepszeniu algorytmu, ponieważ powie Ci, jak zajęty jesteś utrzymaniem procesora.

 0
Author: Chris Roberts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-30 19:06:07