HTML

Programozó Páternoszter

Ez a Programozó Páternoszter (PP) blogja, a programozásról szól. Aktualitása, hogy a Debreceni Egyetem Informatikai Kara Magasszintű programozási nyelvek 1-2, C++ esattanulmányok, Java esettanulmányok című kurzusainak blogja is egyben.

A vadászat

A Debreceni Egyetem Programozói Évkönyve: az UDPROG projekt. A szakmai fórumunk a Facebook-en. Az új előadások a prezin.
A régi előadások:
Prog1:
1. C bevezetés
2. C tárgyalás
3. C befejezés
4. C a gyakorlatban
5. C++ bevezetés
6. C++ tárgyalás
7. C++ befejezés
8. C++ a gyakorlatban
9. Java platform bevezetés
10. Kvantuminformatikai alg. bev.
Prog2:
1. Java bevezetés
2. Java tárgyalás
3. Java befejezés
4. Java a gyakorlatban
5. Software Engineering bev.
6. Java EE bevezetés
7. AspectJ bevezetés
8. BPMN-BPEL SOA programozás
9. C++ haladó
10. Tensorflow

Kövess engem!

Friss topikok

Linkblog

A hetedik (nyolcadik) labor

2011.03.28. 08:49 nb

Éppen a szakmai napok miatt maradnak el laborok így a már eddig sem egyértelmű számozásuk tovább borul...

Laborvezetőknek

Az első hat előadás laborkártyái közül válogatva kérdezzük végig a hallgatóságot! Arra külön figyeljünk, hogy aki nem tudott egy kártyát, az mindenképpen kapjon a következő laboron is!

Hallgatóknak

A szokásos: sosem árt előre készülni a laborra, nálam szereztek így kisbajnokság trófeát. Ha többen is elkészítik, akkor holtversenyben mindannyian megkapják a "trófeákat". Illetve a laborkártyákat nem a beugró helyett találtuk ki, hanem hogy megadja a rendszeres heti készülés alaphangját annak is, aki nem tud, vagy nem akar részt venni a vadászatban. De ha de facto ilyen funkciója is kialakul, az sem baj. Más: lassan lehet védeni a teljesítés egyik szükséges feltételét.

Már komoly mennyiségű munkát elvégeztünk ebben a félévben (eddig is, de még sok élmény vár :), ezért aki nem készült heti gyakorisággal, az úgy érezheti: elmélyült körülötte a víz. Itt a tavaszi szünet holnaptól, az érintve érzett hallgatóknak azt ajánlom, hogy pótolják be az elmaradt munkát, élményeket, tapasztalatokat, azaz programozzanak. Kezdjék ennek a blognak az elején és fogják fel olyan on-line tutoriálnak, ahol (lehetőleg) gyorsan választ is adunk a kommentben felmerült kérdésekre! Ha a programozás helyett a kurzust "átszervező" elmélkedésbe kezdenél, akkor kezd ezzel :)

Tematika

Az alábbi témák legtöbbjét próbáljuk lefedni a "7/8" gyakorlaton:

BN laborján

C++-ban használhatunk becsomagoló osztályos implementációkat, egy ilyet magunk is írunk majd az előadásban. A valóságbani használatra két komoly alternatíva van:

A félévben mindkettővel mélyebben is megismerkedsz majd. Most egy egyszerű TCP szervert írunk meg kezdetként, Qt konzolos alkalmazásként! Majd ezt párhuzamosítjuk.

Az OpenMP-s labormérést az EXOR-os példára (5 trófeáért) az alábbi lépéseken keresztül valósítsd meg:

SVN lerántása, tiszta szövegből titkos készítése (e.c-vel, 8 számjegyű kulccsal), t.c-vel brute force törés:
[norbi@sgu labor8]$ svn co svn://hallg.inf.unideb.hu:2005/bevezetes
[norbi@sgu labor8]$ cd bevezetes/C/bugylibicska/
[norbi@sgu bugylibicska]$ gcc e.c -o e -std=gnu99
[norbi@sgu bugylibicska]$ echo "Már komoly mennyiségű munkát elvégeztünk ebben a félévben (eddig is, de még sok élmény vár :), ezért aki nem készült heti gyakorisággal, az úgy érezheti: elmélyült körülötte a víz. Itt a tavaszi szünet holnaptól, az érintve érzett hallgatóknak azt ajánlom, hogy pótolják be az elmaradt munkát, élményeket, tapasztalatokat, azaz programozzanak. Kezdjék ennek a blognak az elején és fogják fel olyan on-line tutoriálnak, ahol (lehetőleg) gyorsan választ is adunk a kommentben felmerült kérdésekre! Ha a programozás helyett a kurzust "átszervező" elmélkedésbe kezdenél, akkor kezd ezzel :)"|./e 59934434 > titkos.szoveg
[norbi@sgu bugylibicska]$ cp titkos.szoveg ../exor/
[norbi@sgu bugylibicska]$ cd ../exor/
[norbi@sgu exor]$ gcc t.c  -O3 -o t -std=c99
[norbi@sgu exor]$ time ./t <titkos.szoveg |grep 59934434
[norbi@sgu exor]$ time ./t <titkos.szoveg |grep 59934434
Kulcs: [59934434]

real    4m24.133s
user    4m23.699s
sys     0m0.037s
jó lassú, de a félév elején más volt a cél... viszont ha gondolkodás nélkül párhuzamosítjuk nem fog működni, hiszen ha külön szálak dolgoznak majd a "kulcs"-al és a "titkos"-al, akkor el is rontják egymásnak azokat... ezért át kell írnunk a t.c-t. Ezt a következő két képpel segítem, ahol az első mutatja, hogy a párhuzamos szálak egy saját kulcs kulccsal dolgoznak majd

 

illetve a titkos buffer-ből is mindenki egy saját másolaton dolgozik: 

s ezek után az exor() fgv.-ben már a dinamikusan foglalt buffer-be tesszük az eredményt:

  for (int i = 0; i < titkos_meret; ++i)
    {

      buffer[i] = titkos[i] ^ kulcs[kulcs_index];  
      kulcs_index = (kulcs_index + 1) % kulcs_meret;

    }

s persze a kiíratást is elintéztük korábban, a main-ben már nincs mit stb.

Futassunk most az új kódon párhuzamosság, azaz egyelőre OpenMP nélkül:

[norbi@sgu exor]$ gcc t.c -O3 -o t -std=c99
[norbi@sgu exor]$ time ./t <titkos.szoveg |grep 59934434
59934434Már komoly mennyiségű munkát elvégeztünk ebben a félévben (eddig is, de még sok élmény vár :), ezért aki nem készült heti gyakorisággal, az úgy érezheti: elmélyült körülötte a víz. Itt a tavaszi szünet holnaptól, az érintve érzett hallgatóknak azt ajánlom, hogy pótolják be az elmaradt munkát, élményeket, tapasztalatokat, azaz programozzanak. Kezdjék ennek a blognak az elején és fogják fel olyan on-line tutoriálnak, ahol (lehetőleg) gyorsan választ is adunk a kommentben felmerült kérdésekre! Ha a programozás helyett a kurzust átszervező elmélkedésbe kezdenél, akkor kezd ezzel :)

real    3m34.691s
user    3m33.855s
sys     0m0.069s
láthatólag működik, nem rontottuk el...

Párhuzamosan (for-os rész elé ne feledd: #pragma omp parallel for) pedig:

[norbi@sgu exor]$ gcc t.c -fopenmp -O3 -o t -std=c99
[norbi@sgu exor]$ time ./t <titkos.szoveg |grep 59934434
59934434Már komoly mennyiségű munkát elvégeztünk ebben a félévben (eddig is, de még sok élmény vár :), ezért aki nem készült heti gyakorisággal, az úgy érezheti: elmélyült körülötte a víz. Itt a tavaszi szünet holnaptól, az érintve érzett hallgatóknak azt ajánlom, hogy pótolják be az elmaradt munkát, élményeket, tapasztalatokat, azaz programozzanak. Kezdjék ennek a blognak az elején és fogják fel olyan on-line tutoriálnak, ahol (lehetőleg) gyorsan választ is adunk a kommentben felmerült kérdésekre! Ha a programozás helyett a kurzust átszervező elmélkedésbe kezdenél, akkor kezd ezzel :)

real    1m10.466s
user    3m50.372s
sys     0m0.057s
Jó mulatság, férfi munka volt!

PS.: utólag, de még most a labor előtt belegondolva: talán a hallgatóknak nem elég ajándék ma, hogy az Ő laboruk nem marad el, + szokásosan lesznek "súlytó" laborkártyák... így az első 3 egyedül dolgozó hallgatónak jóváírom a laboron a trófeákat!

1 komment

Címkék: labor openmp exor boost.asio qt networking

A párhuzamosság gyönyörködtet

2011.03.27. 12:04 nb

Továbbra is az állatorvosi Mandelbrot halmazt számoljuk, de most nem a Qt-s ösvényen, hanem az előző poszt parancssorában járunk. Az ott megismert mandelpng.c++ programmal, aztán a P-szálakkal számoló pmandelpng.c++, végül az OpenMP-t használó ompmandelpng.c++ forrásokkal dolgozunk. Fordítsuk, futtassuk az elsőt, s közben figyeljük folyamatosan a

top -H -u norbi

parancs kimenetét, hogy lássunk is valamit, a forrásban felnyomtuk az iterációs határt: iteraciosHatar = 32000;

látszik, miközben dolgozik a program:

 

 Olyan fél perc kellett tehát a manőverhez. A PP alapján készítsünk egy olyan kódot, ami párhuzamosan tud dolgozni! A feladat erre alkalmas, hiszen az egyik szál számolja monjuk a kép első 300 sorát, egy másik szál pedig a 300-600-ig sorokat. Persze a programot általánosabban írjuk meg: egy szál a kép magassága / SZALAK_SZAMA darab sort számol majd ki. Ezt a megoldást is teszteljük!

Rend van a világban

Valóban: láthatóan fut a két szálunk:

 és a végrehajtási idő is a felére csökkent:

Azért a jól felkészült mérnök informatikus hallgató észrevesz némi zavart az erőben:

  • miért van külön PID-je a két P-szálnak, hova így az elmélet: a processzen belüli párhuzamosság, hogy azért választottuk ezt, hogy lássák a szálak a globális képet (amivel ugye nincs is baj, hiszen a kép rendben elkészül)
  • a másik a PP 64, PP 66-os mérések kb. ugyanazt mérik mindkét esetben, de a valós idő dupla annyi...

 ezekre varrjunk gombot egy-egy trófeáért persze!

OpenMP

Nem cifrázzuk: a legegyszerűbb megoldás is alkalmas, hiszen a feladatot triviálisan tudtuk párhuzamos részekre bontani. A részeket összefogó ciklus előtt jelezzük, hogy párhuzamosan akarjuk nyomni őket :

 

Ez a megoldás az összes lehetséges szálon párhuzamosítani fog, ez a mi esetünkben 4 magot és max. 4 szálat jelent, amit innen tudunk:

    std::cout << omp_get_num_procs () << std::endl;
    std::cout << omp_get_max_threads () << std::endl;
(A fordításnál a -O3 optimalizációs szintet se felejtsük el bekapcsolni, lásd majd a következő utáni képen.)

Lássuk a medvé(ket)

Szépen látszik, hogy dolgozik a 4 párhuzamos szál, adósok vagyunk még a fordítási, futtatási képpel, íme

Sokkal jobb, kb. 8 szekundumra faragtuk! Persze a -O3 kellett, s az első kettőt e nélkül toltuk. Azért tettünk így, hogy a kétszeres szorzó szépen látszódjon az első két esetben. De megmarad a rend a világban, ha mindhármat az O3 szintű optimalizációval fordítjuk. Ezzel az alábbi eredményeket toltuk:

g++ mandelpngt.c++ `libpng-config --ldflags` -O3 -o mandelpngt
time ./mandelpngt
real    0m18.691s

g++ pmandelpngt.c++ `libpng-config --ldflags` -lpthread -O3 -o pmandelpngt
time ./pmandelpngt b.png1. szal szamitas indul0. szal szamitas
real    0m9.495s

g++ ompmandelpngt.c++ `libpng-config --ldflags` -fopenmp -O3 -o ompmandelpngt
time ./ompmandelpngt c.png4
real    0m8.553s

Kattints a tovább linkre majd a forrásokhoz:

Szólj hozzá!

Címkék: top mandelbrot párhuzamosság pthread openmp p szálak párhuzamos programozás konkurrens programozás

süti beállítások módosítása