Przejdź do treści

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)

CPU

"mózg" komputera, odpowiedzialny za wykonywanie obliczeń i koordynowanie pracy wszystkich komponentów komputera.

więcej...

Pamięć główna (RAM)

CPU

"przestrzeń robocza", służy do tymczasowego przechowywania danych, których zapis zlecił procesor.

więcej...

Pamięć masowa (dysk)

CPU

"magazyn danych", przechowuje dane w sposób trwały, tj. pozostają one zapisane po wyłączeniu komputera.

więcej...

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

Szybkość dostępu do danych

Szybkość dostępu do danych bardzo często jest kluczowym elementem limitującym prędkość prowadzonych obliczeń. Omawiamy trzy podstawowe wielkości, służące do jej opisu:
- opóźnienie (latency), określane również jako czas dostępu,
- przepustowość (bandwidth),
- szybkość transferu (throughput, data transfer rate).

więcej...


Ostatnia aktualizacja: 7 grudnia 2023