01. Podstawy
Wprowadzenie¶
Przez komputer rozumiemy samodzielną maszynę zdolną do prowadzenia obliczeń różnego typu. Uniwersalność komputera wynika z faktu, że jego działanie można zaprogramować. Znajdzie więc on zastosowanie wszędzie tam gdzie programista – poprzez zapisanie ciągu instrukcji, czyli program – "powie" komputerowi co ma robić. Z kolei użytkownik komputera poprzez uruchamianie wybranych przez siebie programów decyduje o tym jakie działania będa wykonywane w danym momencie.
Pisząc własny program obliczeniowy lub optymalizując już napisany kod źródłowy, staramy się uzyskać jak największą wydajność. Zazwyczaj chcemy aby nasza aplikacja w jak najkrótszym czasie dostarczała wyniki dla problemu, do którego rozwiązywania została zaprojektowana. Aby tak się mogło stać, trzeba mieć na uwadze to na jakim sprzęcie finalnie będzie ona wykonywana.
Kluczem do akceleracji obliczeń jest programowanie w taki sposób, który pozwoli na skorzystanie z różnych możliwości danego sprzętu, przewidzianych do przyspieszenia obliczeń. W tym celu niezbędna jest dobra znajomość architektury sprzętu oraz jego potencjału obliczeniowego. Sprzęt
Chcąc zapewnić wysoką wydajność, należy wziąć pod uwagę wszystkie czynniki mające wpływ na zachowanie programu. W tym celu należy spojrzeć całościowo na kolejne etapy związane z tworzeniem kodu (projektowanie i implementacja) oraz jego właściwym wykonaniem (kompilacja i uruchomienie). Na każdym z tych etapów możemy zyskać lub stracić na wydajności końcowego programu.
Oprócz znajomości sprzętu oraz całościowego spojrzenia na tworzenie aplikacji, ważne są również pojęcia do charakteryzacji programu i jego wydajności. Ich znajomość pozwala w łatwiejszy sposób myśleć o tym, co jest istotne dla akceleracji obliczeń i jakie są pożądane cechy programu. Będą one przydatne zarówno na etapie projektowania aplikacji jak i na dalszym etapie analizy jej wydajności. Pojęcia
Sprzęt¶
Układy obliczeniowe¶
Podstawowym elementem komputera odpowiedzialnym za wykonywanie obliczeń jest procesor, a dokładniej CPU (central processing unit). W dużym uproszczeniu jest to układ elektroniczny, który na podstawie przekazywanych do niego instrukcji wykonuje konkretne operacje. Operacje te mogą być typowo obliczeniowe (jak dodawanie czy mnożenie podanych wartości), ale nie tylko – mogą również dotyczyć konfiguracji dostępu do pamięci, kontroli uprawnień, czy komunikacji z innymi urządzeniami, a więc zadań związanych z zarządzaniem pracą całego komputera.
Oprócz klasycznych procesorów istnieją różne typy układów przeznaczonych do obliczeń, które ogólnie są określane jako akceleratory. Można wyróżnić:
- specjalne procesory do równoległego wykonywania dużej ilości obliczeń tego samego typu,
- układy wyspecjalizowane w bardzo szybkim wykonywaniu konkretnego zadania obliczeniowego.
Zasadniczym założeniem akceleratorów jest zwiększenie wydajności względem standardowego CPU. Obecnie najbardziej popularnym rodzajem akceleratora jest GPU (graphics processing unit) – pierwotnie był to układ przewidziany wyłącznie do zadań związanych z grafiką, jednak okazało się, że jego architektura pozwala również na obliczenia ogólnego przeznaczenia.
Moc obliczeniowa – równoległość¶
Współczesne układy obliczeniowe są bardzo zaawansowane w swojej konstrukcji (pojedynczy układ jest zbudowany nawet z kilku miliardów tranzystorów) i posiadają bardzo dużą moc obliczeniową. Już pojedynczy procesor może wykonywać miliony a nawet miliardy operacji na sekundę. Historycznie, procesory zwiększały swoją wydajność poprzez coraz szybsze działanie (taktowanie procesora liczone w MHz). Jednakże obecnie, głównym źródłem wzrostu wydajności jest równoległość, czyli możliwość jednoczesnego wykonywanie wielu operacji przez ten sam układ obliczeniowy.
Układy obliczeniowe posiadają różne mechanizmy automatycznie optymalizujące wydajność, np. przyspieszające wykonanie niektórych instrukcji, lub ich jednoczesne wykonanie. To ile z tych możliwości zostanie wykorzystanych zależy od jakości danego programu, a czasem również od sposobu jego kompilacji. W szczególności, jeśli kod źródłowy nie będzie sprzyjał użyciu niektórych możliwości, może się okazać że spożytkuje tylko ułamek dostępnej mocy obliczeniowej. Przykładem może być wektoryzacja – jeśli program umożliwi jej użycie, jego wydajność może wzrosnąć nawet kilkukrotnie.
Podstawy architektury komputera¶
Fizycznie komputer składa się z wielu komponentów o różnym przeznaczeniu umieszczonych na lub połączonych z tzw. płytą główną (motherboard). Z perspektywy programistycznej najważniejsze są trzy główne elementy.
Procesor (CPU)¶
mózg komputera – odpowiedzialny za wykonywanie obliczeń i koordynowanie pracy wszystkich komponentów komputera.
Pamięć główna (RAM)¶
przestrzeń robocza – służy do tymczasowego przechowywania danych, których zapis zlecił procesor.
Pamięć masowa (dysk)¶
magazyn danych – przechowuje dane w sposób trwały, tj. pozostają one zapisane po wyłączeniu komputera.
Omawiając zagadnienia związane z komputerem należy pamiętać, że podstawą jego działania jest reprezentacja binarna. Oznacza to, że wszystkie dane – liczby, obrazki, litery, dokumenty – są zapisywane w postaci ciągów zer i jedynek. Najmniejsza jednostka informacji to tzw. bit (jego wartość to albo 0, albo 1). W praktyce operuje się najczęściej na bajtach: 1 bajt = 8 bitów, czyli jeden bajt pozwala na wyrażenie różnych konfiguracji.
W związku z tym, warto mieć na uwadze, że z perspektywy komputera, czynności które on wykonuje to przetwarzanie ciągów zer i jedynek. Natomiast z perspektywy człowieka kluczem jest interpretacja danych, która nadaje tym zerom i jedynkom znaczenie. Przykładowo, pojedynczy bajt można zinterpretować jako:
- liczbę z zakresu od do ,
- liczbę z zakresu od do ,
- znak ASCII, np. wartość odpowiada literze "a".
Pojęcia¶
Wydajność obliczeń¶
Ocena efektywności wykorzystania zasobów jest kluczowym aspektem w procesie akceleracji oprogramownia. Istnieje kilka miar używanych do charakteryzacji wydajności obliczeń:
- FLOPS (floating-point operations per second)
- MIPS (milion instructions per second)
- CPI (cycles per instruction) lub IPC (instructions per cycle)
Oprócz nich omawiamy również aspekty dotyczące wydajności komputera i oprogramownia:
- jak jest wyznaczana teoretyczna moc obliczeniowa komputera
- czym są benchmarki, co to jest HPL, HPCG, lista TOP500
Szybkość dostępu do danych¶
Szybkość dostępu do danych bardzo często jest głównym czynnikiem limitującym prędkość prowadzonych obliczeń. Omawiamy trzy podstawowe wielkości, służące do jej opisu:
- opóźnienie (latency)
- przepustowość (bandwidth)
- szybkość transferu (throughput)
Model Roofline¶
Model Roofline to model analizy wydajności służący do oceny wydajności aplikacji względem sprzętowych czynników limitujących, takich jak:
- szybkość pamięci (tzw. memory bound),
- możliwości obliczeniowe procesora/akceleratora (tzw. compute bound).
Kluczową jednostką dla modelu jest intensywność obliczeń (computational/arithmetic intensity) względem której interpretuje się wydajność i ocenia czy aplikacja efektywnie wykorzystuje możliwości sprzętowe.