Politechnika Krakowska Im. Tadeusza Ko±ciuszki

Transkrypt

Politechnika Krakowska Im. Tadeusza Ko±ciuszki
Politechnika Krakowska Im. Tadeusza
Ko±ciuszki Wydziaª Fizyki, Matematyki i
Informatyki
23 stycznia 2012
Programowanie rozproszone i równolegªe niestacjonarne magisterskie uzupeªniaj¡ce.
Dokumentacja MirrorWeb
Author: Artur Bednarczyk, Krystian Heród
Studenci pierwszego roku, studiów niestacjonarnych
Stopnie« drugi.
Spis tre±ci
I Wprowadzenie
2
II Wykorzystane technologie
2
1
Technologia libcURL (cURL)
3
2
Technologia boost::regex
3
3
Biobioteka STL
5
4
Technologia OpenMP
5
III Najwa»niejsze funkcje programu
6
IV Testowanie wydajno±ci aplikacji MirrorWeb z wykorzystaniem OpenMP
8
1
V Instalacja, konguracja i kompilacja aplikacji MirrorWeb
9
VI Wnioski
9
VII Bibliograa
9
Cz¦±¢ I
Wprowadzenie
Celem projektu byªo stworzenie programu do pobierania zadanej strony www z
wykorzystaniem ±rodowiska umo»liwiaj¡cego przyspieszenie dziaªania tego programu poprzez zrównoleglenie pewnego obszaru danej aplikacji.
Projekt zostaª stworzony w zgodno±ci ze specykacja która oparta jest w j¦zyku C++. Ze wzgl¦du powielanie wykonywania tych samych czynno±ci w p¦tli,
rozs¡dnym rozwi¡zaniem byªo wykorzystanie ±rodowiska OpenMP. Podstawowymi problemami do rozwi¡zania byªo poª¡czenie z serwerem, dzi¦ki któremu
uzyskamy dost¦p do zawarto±ci strony gªównej. Rozwi¡zaniem byªo wykorzystanie biblioteki cURL, która daje nam t¡ i wiele wi¦cej mo»liwo±ci.
Kiedy
uzyskali±my ju» dost¦p do tzw. masterpage, kolejnym zagadnieniem byªo przeszukiwanie pliku w poszukiwaniu wyra»e«, mówi¡cych o odno±nikach i plikach,
aby mo»na byªo odtworzy¢ struktur¦ i wygl¡d strony.
W dalszej cz¦±ci, opisane zostan¡ pokrótce wykorzystane technologie i przedstawiony sposób rozwi¡zania napotkanych problemów.
Nast¦pnym etap przedstawia wykres który ilustruje zale»no±¢ czasu od ilo±ci
wykorzystanych w¡tków przy zrównolegleniu oblicze« danego programu.
Wnioski ko«cowe które zostaªy zawarte w danej dokumentacji, przedstawi¡
zalety i wady wyko»ystywanych technologi.
Cz¦±¢ II
Wykorzystane technologie
W danej pracy wyko»ystali±my kilka z poznanych nam ±rodowisk które które
umo»liwiaªy usprawnienie dziaªania danej aplikacji do pobierania stron internetowych za po±rednictem protokoªu sieciowego HTTP.
2
1
Technologia libcURL (cURL)
cURL jest bibliotek¡ która zostaªa napisana w j¦zyku C, posiada ona bardzo
du»y stopnie« integracji z interfejsami dla ponad 30 innych j¦zykó programowaniatakich np.
jak :
Ada95, Basic, C, C++, Java, .NET, Object Pascal,
Pascal, Perl, PHP, Phyton, Ruby, Visual Basic. Bibioteka ta w znacznym stopniu uªatwia prac¦ tworzenia aplikacji korzystania z takich protokoªów jak HTTP,
HTTPS, FTP, SFTP, FTPS, TFTP, SCP, Telnet, certykaty HTTPS, ciasteczka
(cookies), upload FTP.
Biblioteka tak udost¦pniona jest na licencji MIT.
W naszej pracy wykorzystali±mi dan¡ bibliotek¦ libcURL do komunikacji z
serwerem po przez protokuª sieciowy HTTP.
2
Technologia boost::regex
Technologia któr¡ wykorzystali±my przy problematyce porównywania wczytanych znakówa dokªadniej przy przetwarzaniu tekstu zawartego w danym pliku
jest biblioteka boost::regex która daªa nam mo»liwo±¢ integracji j¦zyka C++
wyrarze« regularnych.
Do skªadowania podstawowy deklracji w postacji wyra»e« regularnych mamy
dost¦pne trzy formy, a mianowici¦:
•
Perl (jako domy±lna)
•
POSIX roszerzona (porównywalna do egrep czy awk)
•
POSIX podstawowa (porównywalna do grep cz emacs)
Podstawowa skªadnia w Perl'u:
•
. dowolny znak
•
^ pocz¡tek linii
•
$ koniec linii
•
( ) pocz¡tek i koniec znaczonego grupowania
•
(?: ) pocz¡tek i koniec nieznaczonego grupowania
•
* powtórzenie atomu zero lub wi¦cej razy
•
+ powtórzenie atomu jeden lub wi¦cej razy
•
? powtórzenie atomu zero lub jeden raz
•
{n} powtórzenie atomu dokªadnie n razy
•
{n,} powtórzenie atomu n lub wi¦cej razy
•
{n,m} powtórzenie atomu od n do m razy
3
•
| alternatywa
•
[znaki^odrzuty] dopuszczalny znaki i niedopuszczalne odrzuty
•
\< \> \b pocz¡tek, koniec sªowa i którekolwiek z nich
•
\d <=> [[:digit:]] cyfra
•
\l <=> [[:lower:]] maªa litera
•
\s <=> [[:space:]] spacja
•
\u <=> [[:upper:]] du»a litera
•
\w <=> [[:word:]] znak "sªowny" (alfanumeryczny lub _)
•
\D <=> [^[:digit:]] nie: cyfra
•
\L <=> [^[:lower:]] nie: maªa litera
•
\S <=> [^[:space:]] nie: spacja
•
\U <=> [^[:upper:]] nie: du»a litera
•
\W <=> [^[:word:]] nie :znak "sªowny"
•
(?#komentarz) ignorowany (komentarz)
•
(?=wzorzec) "zjada" 0 znaków tylko je»eli wzorzec si¦ zgadza
•
(?!wzorzec) "zjada" 0 znaków tylko je»eli wzorzec nie pasuje
Dana technologia posiada równierz tzw. szablony klas, które umo»liwiaj¡ skªadowanie wyra»¦« regularnych w formie parametru a pó¹niej wzale»no±ci od u»ytej klasy/funkcji danej biblioteki porównuj¡ lub nawet zamieniaj¡ miejscami np:
odpowiednie strinigi w danym pliku.
Jedne z gªówniejszych klas danej bilbioteki boost::regex, s¡:
•
regex_match(), dopasowywanie parametrów
•
regex_search(), przeszukiwanie parametrów
•
regex_replace(), zast¦powanie parametrów
•
regex_token_iterator(), dzielenie parametrów
4
3
Biobioteka STL
Za po±rednictwem danej blibioteki STL aplikacja MirrorWeb wykorzystuje takie
jej elementy jak zbiór i stos. (eng. set, stack).
Zbiorem nazywamy struktur¦ danych opart¡ na formie drzewa. Ka»dy element w danym zbiorze jest posortowany wedªug pewnego klucza.
Forma drzewa zapewnia nam szybki dost¦p do wyszukiwania elementów w
podanym zbiorze. Jednym z kluczowych problemów jakie posiada set stanowi
modykacja danego zbioru, mianowicie w mom¦cie gdy chcieliby±my przenie±¢
dowolny element z danego zbioru musimy go usun¡¢ a potem wprowadzi¢ jeszcze
raz.
Korzystaj¡c z terminologii STL-a zbiory s¡ to tzw.
kontenerami asocja-
cyjnymi (o zmiennej dªugo±ci, pozwalaj¡cymi na operowanie elementami przy
u»yciu kluczy).
Operacje jakie wykorzystali±my za po±rednictwem zbioru to:
insert() - wstawianie elementu do zbioru
Kolejn¡ struktur¡ która zawarli±my przy tworzenia danej aplikacji MirrorWeb jest struktura stosu. Stos stanowiª dobre rozwi¡zanie dla elementów które
s¡ gromadzone w postaci stringów.
Operacje jakie wykorzystali±my za po±rednictwem stosu to:
push() - wstawianie nowego elementu na szczyt stosu
pop() - zdejmowanie elementu ze szczytu stosu
4
Technologia OpenMP
Technologia OpenMP jest elementem który sªu»y do implementacji wielow¡tkowo±ci, czyli umo»liwia zrównoleglanie programu komputerowego, w którem
gªówny w¡tek rozgaª¦zia si¦ na kilka w¡tków.
W¡tki pracuj¡ wspóªbie»nie i
mog¡ zosta¢ przydzielone przez ±rodowisko uruchomieniowe ró»nym procesorom.
Fragment kodu, który ma by¢ wykonywany równolegle, jest w kodzie ¹ródªowym oznaczany odpowiedni¡ dyrektyw¡ preprocesora. Tu» przed wykonanie
tak zaznaczonego kodu gªówny w¡tek rozgaª¦zia si¦ na okre±lon¡ liczb¦ nowych
w¡tków. Ka»dy w¡tek posiada unikalny identykator tzw. id), którego warto±¢
mo»na odczyta¢ funkcj¡ omp_get_thread_num().
Gdy przetwarzanie zrów-
noleglonego kodu w¡tki dojdzie do ko«ca pozostaªe wª¡czaj¡ si¦ z powrotem
do w¡tku gªównego, który samotnie kontynuuje dziaªanie programu i w innym
miejscu mo»e ponownie rozdzieli¢ si¦ na nowe w¡tki.
Domy±lnie wszystkie w¡tki przetwarzaj¡ zrównoleglon¡ cz¦±¢ kodu niezale»nie od siebie. Do podziaªu zadania pomi¦dzy w¡tki sªu»¡ specjalne konstrukcje
podziaªu zadania.
Za przydziaª w¡tków do poszczególnych procesorów odpowiada ±rodowisko
uruchomieniowe, które stosuje algorytm uwzgl¦dniaj¡cy m.in. aktualne obci¡»enie poszczególnych procesorów oraz caªej maszyny. Liczba nowych w¡tków mo»e
5
by¢ okre±lona tu» przed uruchomieniem programu za po±rednictwem zmiennych
±rodowiskowych lub w kodzie ¹ródªowym za pomoc¡ specjalnych funkcji.
Dzi¦ki temu, »e standard OpenMP zostaª uzgodniony przez gªównych producentów sprz¦tu i oprogramowania komputerowego, charakteryzuje si¦ on przeno±no±ci¡, skalowalno±ci¡, elastyczno±ci¡ i prostot¡ u»ycia. Dlatego mo»e by¢
stosowany do tworzenia aplikacji równolegªych dla ró»nych platform, od komputerów klasy PC po superkomputery.
OpenMP mo»na stosowa¢ do tworzenia aplikacji równolegªych na klastrach
komputerów wieloprocesorowych. W tym przypadku zwykle stosuje si¦ rozwi¡zanie hybrydowe, w którym programy s¡ uruchamiane na klastrach komputerowych pod kontrol¡ alternatywnego interfejsu MPI, natomiast do urównoleglenia
pracy w¦zªów klastrów wykorzystuje si¦ OpenMPI. Alternatywny sposób polega
na zastosowaniu specjalnych rozszerze« OpenMP dla systemów pozbawionych
pami¦ci wspóªdzielonej (np. Cluster OpenMP Intela).
Gªówne funkcje które zostaªy zawarte przy tworzeniu aplikacji MirrorWeb
to:
•
omp_set_num_threads(), ustawia liczbe w¡tków
•
#pragma omp parallel private(X), ustawia pocz¡tek obczaru kodu który
zostanie zrównoleglony oraz przyjmuje parametr X jako prywatny argument,
•
#pragma omp for schedule(static) nowait, ustala pocz¡tek obszaru zrównoleglenia dla p¦tli for z parametrym statycznym funkcji schedule a wykonanie danej pragmy nie zale»y od innych funkcji, nowiat (nie czeka)
Cz¦±¢ III
Najwa»niejsze funkcje programu
Jedn¡ z najbardziej znacz¡cych funkcji które realizuje technologia cURL jest
pobieranie tzw.
masterpage, która przyjmuje url w postaci zmiennej typu
char, nast¦pnie pobiera przetworzony kod strony i zapisuje go w postaci pliku.
Realizacja pobierania pierwszej strony opisuje poni»sza funkcja:
FILE * le = (FILE *)fopen(myleName,"w+");
if(!le)
{
perror("Nie udalo sie otworzyc pliku, dzialanie programu zostalo zakonczone!");
exit(0);
}
//cULR glowny element pobierajacy pierwsza strone
CURL *handle = curl_easy_init();
curl_easy_setopt(handle,CURLOPT_URL,urlStronaStartowa.c_str());
curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION, write_data);
6
//zapis do pliku
curl_easy_setopt(handle,CURLOPT_WRITEDATA, le);
curl_easy_perform(handle);
curl_easy_cleanup(handle);
fclose(le);
Funkcja która przekazuje linijka po linijce wczytany ci¡g znaków do nast¦pnej funkcji parsuj¡cej o nazwie parsujLinieStrony() odpowiada poni»szy kod:
Myle.open (myleName);
//wczytuje i zapisuje linijka po linijce (string)
if (Myle.is_open())
{
while (Myle.good())
{
getline(Myle,line);
parsujLinieStrony(line,urlStronaStartowa);
}
Myle.close();
Za po±rednictwem wyra»enia regularnego,
//inicjalizacja paternu
boost::regex rxLinki("href=\"");
boost::regex rxPlik("src=\"");
//porownywanie wczytanych stringow z paternem
bool valid = boost::regex_search(linia.c_str(), res, rxLinki);
funkcja parsujLinieStrony(line,urlStronaStartowa) analizuje dostarczony kawaªek pliku i wstawia go do opowiedniej struktury, stosu, zbioru :
if (valid) {
string link = res[0].second;
int i = link.nd('"');
link.resize(i);
linki.push(link);
odwiedzoneStrony.insert(link);
}
valid = boost::regex_search(linia.c_str(), res, rxPlik);
if (valid)
{
string link = res[0].second;
int i = link.nd('"');
link.resize(i);
//Dodaje jeden znak do tre±ci napisu, zwi¦kszaj¡c jego rozmiar (koncepcja
operatora)
pliki.push_back(urlStronaStartowa+"/"+link);
}
Obszar który zrównoleglamy za po±rednictwem technologi OpenMP odpowiada za stworzenie, przekazenie i zakmni¦nie pliku w którym potencjalny plik
zostaª ±ci¡gniety.
//obszar równoleglenia danych (rozdawanie watka pliki do zapisu)
7
omp_set_num_threads(32);
#pragma omp parallel private(thread_number)
{
#pragma omp for schedule(static) nowait
for (i=0; i<count; i++)
{
thread_number = omp_get_thread_num();
string urlPliku = pliki.at(i);
CURL *handle = curl_easy_init();
sprintf(plik,"PobranyPlik%d.dat",i);
cout<<plik<<endl;
cout<<urlPliku<<endl;
cout<<"Watek: "<<thread_number<<endl;
FILE * le = (FILE *)fopen(plik,"w+");
curl_easy_setopt(handle,CURLOPT_URL,urlPliku.c_str());
curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(handle,CURLOPT_WRITEDATA, le);
curl_easy_perform(handle);
curl_easy_cleanup(handle);
fclose(le);
StopTime = clock();
cout<<"Czas zapisu: "<<StopTime/10000<<" sekunda"<<endl;
}
}
//Koniec obszaru równoleglenia
Cz¦±¢ IV
Testowanie wydajno±ci aplikacji
MirrorWeb z wykorzystaniem
OpenMP
8
Cz¦±¢ V
Instalacja, konguracja i
kompilacja aplikacji MirrorWeb
Biblioteki które zostaªy zaimplementowane w ±rodowiko Systemu Ubuntu 11.10
x64 (libcurl,libboost)
sudo apt-get install libcurl4-gnutls-dev
sudo apt-get install libboost-all-dev (+/- 100-300mb)
Sposób kompilacji danego kodu ¹ródªowego
g++-4.6 -fopenmp MirrorWeb.cpp -lboost_regex-mt -lcurl -o MirrorWeb
Cz¦±¢ VI
Wnioski
Program stworzony z wykorzystaniem przedstawionych technologii speªnia pocz¡tkowe zaªo»enia i okre±lone wymagania. Wykorzystane technologie umo»liwiaj¡ poprawne i skuteczne dziaªanie programu. Podczas testowania mo»emy
zauwa»y¢ »e wykorzystanie zrównoleglenia obszarów programu, przyspiesza jego
prac¦ i dziaªanie.
Cz¦±¢ VII
Bibliograa
Literatura
[1] B. Karlsson, Wi¦cej ni» C++. Wprowadzenie do bibliotek Boost, Helion,
Gliwice 2006
9
[2] Boost
C++
Libraries
-
Boost.Regex
documentation
(http://www.boost.org/)
[3] OpenMP, http://computing.llnl.gov/tutorials/openMP/ Author:Blaise Barney, Lawrence Livermore National Laboratory
10