Użycie funkcyjnych języków programowania do współbieżnej obsługi architektur wielordzeniowych

Concurrent computations in multi-core architectures using functional programming languages

Autor: Jacek Galanciak

Opiekun pracy: dr hab. inż. Artur Klepaczko prof. ucz.

Rodzaj pracy: praca dyplomowa magisterska

Data obrony: 2010-09-24

Streszczenie

Obserwacja częstotliwości taktowania współczesnych mikroprocesorów pokazuje, iż przyrost
szybkości zegara zatrzymał się niemal całkowicie w roku 2005. Projektanci układów
napotkali na problemy, których rozwiązanie jest trudne lub nieopłacalne. Z tego powodu,
zmieniono kierunek zwiększania wydajności komputerów. Zamiast podwyższać częstotliwość
pracy zegara, umieszcza się w tym samym układzie kilka rdzeni pracujących jednocześnie.
Nowy trend rozwoju procesorów stwarza jednak kolejny problem – programy pisane z myślą
o wykonaniu sekwencyjnym nie potrafią wykorzystać wielu rdzeni procesora. Powstaje tutaj
niepokojąca zależność – komputery stają się coraz szybsze, lecz aplikacje działają cały czas z
taką samą prędkością. Pojawia się zatem konieczność zastąpienia algorytmów sekwencyjnych
oprogramowaniem zbudowanym ze współbieżnie działających składników.
Jednakże programowanie współbieżne stanowi nadal aktualny problem. W praktyce okazuje
się, iż jego efektywne rozwiązanie wymaga nowoczesnych technik informatycznych.
Klasyczne podejście do współbieżności, oparte o wątki, blokady i synchronizacje
współdzielonych danych, jest rozwiązaniem mało wygodnym, wymagającym dużego nakładu
pracy. Tak powstały kod jest niezwykle rozległy, podatny na błędy i trudny w rozbudowie.
Niniejsza praca ma na celu przedstawienie alternatywnego sposobu na programowanie
współbieżne. Ma ona zaprezentować języki funkcyjne, oparte na całkowicie odmiennym
paradygmacie programowania. Zostanie umówiona składnia trzech współczesnych języków
funkcyjnych – Scala, Erlang i Clojure wraz z ich technikami obsługi współbieżności –
pamięcią transakcyjną oraz modelem aktora.
Zwieńczeniem rozprawy jest praktyczna implementacja współbieżnie działającego serwera
HTTP dokonującego klasyfikacji wektorów przy użyciu sztucznej sieci neuronowej.
Aplikacja ma wykazać, że użycie języka funkcyjnego faktycznie wiąże się z wysoką
efektywnością obliczeniową i użyciem wszystkich rdzeni procesora oraz ma sprawdzić, czy
programowanie funkcyjne rzeczywiście upraszcza i skraca zapis programu.

Abstract

Latest technological development in the area of central processing units shows an interesting
phenomenon. The continuous rise of CPU clock frequency, which has been present for
decades, stopped in 2005. It does not, however, mean that the engineers encountered a hard
limit preventing silicon microprocessors from further development. The progress moved to
different area – instead of increasing CPU clock frequency, engineers tend to put several cores
on a single chip.
However, horizontal scaling created a new challenge. Sequential programs running on modern
multi-core machines notice no performance improvements. It is certain that the only way to
fully utilize computing power of all cores is concurrent programming. Thus, modern
languages like Java and C++ were made capable of handling multithreading.
Classical approach towards concurrent programming involves intensive use of locking, shared
data synchronization and threading. Unfortunately, these techniques tend to grow applications'
codebase, making it laborious to further develop the program. In addition, shared variables
accessed concurrently may cause data consistency violations and consequently numerous
bugs which are often difficult to handle.
The dissertation suggests functional programming as an alternative way of handling massive
concurrency. It involves a complete paradigm shift, including use of immutable data types and
functions instead of variables. The thesis continues the subject on two different concurrency
programming methods – actor model and software transactional memory.
Finally, the dissertation includes practical implementation of neural network server over
HTTP protocol. It is to demonstrate both the simplicity of expressive functional code and high
performance of concurrent programs written in a functional language.