This shows you the differences between two versions of the page.
|
asc:laboratoare:04 [2026/03/24 02:02] tudor.calafeteanu [Laboratorul 4 - Analiza Performantei Programelor] |
asc:laboratoare:04 [2026/03/26 14:24] (current) emil.slusanschi [Reference] |
||
|---|---|---|---|
| Line 103: | Line 103: | ||
| Pentru acest laborator se pot utiliza sistemele din cluster prin intermediul fep.grid.pub.ro: | Pentru acest laborator se pot utiliza sistemele din cluster prin intermediul fep.grid.pub.ro: | ||
| - | - ''ssh -Y username@fep.grid.pub.ro'' (natural puneti utilizatorul vostru in loc de username) | + | - Vă conectați pe ''fep'', conform [[https://ocw.cs.pub.ro/courses/asc/laboratoare/01|Laboratorului 1]] (Vezi ''Ce este FEP-ul?)''. |
| - | - ''wget https://ocw.cs.pub.ro/courses/_media/asc/lab6/lab6_skl.tar.gz -O lab6_skl.tar.gz'' - Downloadati arhiva laboratorului | + | - Downloadați arhiva laboratorului: ''wget https://ocw.cs.pub.ro/courses/_media/asc/laboratoare/lab4_skl.tar.gz -O lab4_skl.tar.gz''. |
| - | - ''tar -xzvf lab6_skl.tar.gz'' - dezarhivati arhiva downloadata mai sus | + | - Dezarhivați arhiva downloadată mai sus: ''tar -xzvf lab4_skl.tar.gz''. |
| - | - ''%%srun --time 00:05:00 --x11 -p haswell --pty /bin/bash%%'' - conectati-va pe coada Haswell cu 14 servere | + | - Intrați în mod interactiv pe Haswell: ''%%srun --pty bash%%''. |
| - | - ''%%apptainer run docker://gitlab.cs.pub.ro:5050/asc/asc-public/c-labs:1.3.1 /bin/bash%%'' - accesati imaginea de docker in cadrul căreia avem permisiunile necesare realizării laboratorului | + | - Accesați imaginea de docker în cadrul căreia veți face laboratorul:''%%apptainer run docker://gitlab.cs.pub.ro:5050/asc/asc-public/c-labs:1.3.1 /bin/bash%%'' |
| - | **Task 0** - Folosit valgrind pentru ''task0.c'' urmarind TODO-uri pentru teste. | + | **Task 0** - Folositi Callgrind pentru ''task0.c'', urmărind TODO-urile din cod. |
| - | * ''make task0'' pentru versiunea seriala | + | <code sh> |
| - | * ''make openmp_task0'' pentru versiunea paralelizata | + | # Versiunea serială |
| - | * <code sh> | + | |
| - | [@fep ]$ srun --time 00:05:00 --x11 -p haswell --pty /bin/bash | + | |
| - | [@haswell-wnxx ~]$ apptainer run docker://gitlab.cs.pub.ro:5050/asc/asc-public/c-labs:1.3.1 /bin/bash | + | |
| Apptainer> make task0 | Apptainer> make task0 | ||
| Apptainer> valgrind --tool=callgrind -v --dump-every-bb=10000000 ./task0 | Apptainer> valgrind --tool=callgrind -v --dump-every-bb=10000000 ./task0 | ||
| - | Apptainer> kcachegrind | + | Apptainer> callgrind_annotate callgrind.out.<pid> |
| + | |||
| + | # Versiunea paralelizată | ||
| Apptainer> make clean | Apptainer> make clean | ||
| Apptainer> make openmp_task0 | Apptainer> make openmp_task0 | ||
| Apptainer> valgrind --tool=callgrind -v --dump-every-bb=10000000 ./task0 | Apptainer> valgrind --tool=callgrind -v --dump-every-bb=10000000 ./task0 | ||
| - | Apptainer> kcachegrind | + | Apptainer> callgrind_annotate callgrind.out.<pid> |
| </code> | </code> | ||
| - | **Task 1** - Analizati aplicatia Tachyon. | + | Notați și explicați următoarele observații: |
| - | * Rulati scriptul ''task1.sh'' pentru a descarca si compila Tachyon. Atentie, trebuie sa rulati pe fep scriptul task1.sh pentru ca doar aici aveti disponibil libX11.so de care aveti nevoie pentru compilare. Pe masinile proprii aveti de asemenea nevoie de libX11.so asa incat e bine sa il intalati inainte de rularea acestui task. | + | * Care este funcția cu cel mai mare număr de instrucțiuni (coloana ''Ir'')? |
| - | * Varianta seriala ''tachyon_find_hotspots'' | + | * Cum diferă profiling-ul serial de cel paralel? Ce funcții noi apar în versiunea paralelizată? |
| - | * Varianta paralelizata ''tachyon_analyze_locks'' | + | * De ce ordinea primelor 100 de prime diferă între versiunea serială și cea paralelă? |
| - | * <code sh> | + | |
| - | [@fep ~]$ ./task1.sh | + | **Task 1** - Analizati aplicatia Tachyon (ray tracer). |
| - | [@fep ]$ srun --time 00:05:00 --x11 -p haswell --pty /bin/bash | + | |
| - | [@haswell-wn01 ~]$ apptainer run docker://gitlab.cs.pub.ro:5050/asc/asc-public/c-labs:1.3.1 /bin/bash | + | <code sh> |
| - | Apptainer> cd tachyon | + | Apptainer> ./task1.sh |
| + | |||
| + | # Versiunea serială | ||
| Apptainer> valgrind --tool=callgrind --collect-jumps=yes --dump-instr=yes --collect-systime=yes -- ./tachyon_find_hotspots dat/balls.dat | Apptainer> valgrind --tool=callgrind --collect-jumps=yes --dump-instr=yes --collect-systime=yes -- ./tachyon_find_hotspots dat/balls.dat | ||
| + | Apptainer> callgrind_annotate callgrind.out.<pid> | ||
| + | |||
| + | # Versiunea paralelizată | ||
| Apptainer> valgrind --tool=callgrind --collect-jumps=yes --dump-instr=yes --collect-systime=yes -- ./tachyon_analyze_locks dat/balls.dat | Apptainer> valgrind --tool=callgrind --collect-jumps=yes --dump-instr=yes --collect-systime=yes -- ./tachyon_analyze_locks dat/balls.dat | ||
| + | Apptainer> callgrind_annotate callgrind.out.<pid> | ||
| + | |||
| + | # Perf (doar software counters în container) | ||
| + | Apptainer> perf stat ./tachyon_find_hotspots dat/balls.dat | ||
| + | Apptainer> perf stat ./tachyon_analyze_locks dat/balls.dat | ||
| </code> | </code> | ||
| - | * Analizati cu perf | ||
| + | Notați și explicați următoarele observații: | ||
| + | * Care sunt funcțiile cu cel mai mare număr de instrucțiuni în versiunea serială? | ||
| + | * Ce funcție consumă cel mai mult din versiunea serială și de ce? (hint: ''initialize_2D_buffer'') | ||
| + | * Cum diferă profiling-ul serial de cel paralel? Ce funcții noi apar? | ||
| + | * Unde este plasat mutex-ul în ''analyze_locks''? Este necesar acolo? | ||
| - | **Task 2** - Folositi tool-ul cachegrind din valgrind pentru a analiza codul care realizeaza inmultirea de matrice folosind diferite reordonari ale buclelor. | + | **Task 2** - Analizați înmulțirea de matrice cu diferite ordonări ale buclelor folosind Cachegrind. |
| * Compilati si rulati ''task2.c'' | * Compilati si rulati ''task2.c'' | ||
| * Notati observatiile voastre legate de numarul de I refs, D refs, D1 misses, branches si mispredicts. | * Notati observatiile voastre legate de numarul de I refs, D refs, D1 misses, branches si mispredicts. | ||
| - | * <code sh> | + | |
| - | [@fep ]$ srun --time 00:05:00 --x11 -p haswell --pty /bin/bash | + | <code sh> |
| - | [@haswell-wn01 ~]$ apptainer run docker://gitlab.cs.pub.ro:5050/asc/asc-public/c-labs:1.3.1 /bin/bash | + | |
| Apptainer> make task2 | Apptainer> make task2 | ||
| - | Apptainer> valgrind --tool=cachegrind --branch-sim=yes ./task2 1 | + | Apptainer> valgrind --tool=cachegrind --cache-sim=yes ./task2 1 |
| - | Apptainer> valgrind --tool=cachegrind --branch-sim=yes ./task2 2 | + | Apptainer> valgrind --tool=cachegrind --cache-sim=yes ./task2 2 |
| - | Apptainer> valgrind --tool=cachegrind --branch-sim=yes ./task2 3 | + | Apptainer> valgrind --tool=cachegrind --cache-sim=yes ./task2 3 |
| </code> | </code> | ||
| + | Completați tabelul cu rezultatele obținute: | ||
| - | <note important> | + | ^ Metric ^ Mode 1 (ijk) ^ Mode 2 (ikj) ^ Mode 3 (jki) ^ |
| - | Recomandăm sa va delogati mereu de pe serverele din cluster dupa terminarea sesiunii, utilizand comanda ''exit'' | + | | I refs | | | | |
| + | | D refs | | | | | ||
| + | | D1 miss rate | | | | | ||
| + | | LLd miss rate | | | | | ||
| - | Alternativ, daca ati uitat sesiuni deschise, puteti verifica acest lucru de pe fep.grid.pub.ro, utilizand comanda ''squeue''. In cazul in care identificati astfel de sesiuni "agatate", le puteti sterge (si va rugam sa faceti asta), utilizand comanda ''scancel ID'' unde ID-ul il identificati din comanda anterioara ''squeue''. Puteți folosi mai precis ''squeue -u username'' (username de pe fep.grid.pub.ro) pentru a vedea doar sesiunile care vă interesează. | + | Notați și explicați următoarele observații: |
| + | * Comparați valorile ''I refs'' și ''D refs'' între cele 3 ordonări. Ce observați? | ||
| + | * Comparați valorile ''D1 miss rate'' între cele 3 ordonări. Care mod este mai eficient din punct de vedere al cache-ului și de ce? | ||
| + | * Comparați valorile ''LLd miss rate'' între cele 3 ordonări. Ce observați? | ||
| + | * Cum influențează ordinea buclelor accesul la memorie în C? | ||
| - | Daca nu veti face aceasta delogare, veti putea ajunge in situatia in care sa nu va mai puteti loga pe nodurile din cluster. | ||
| - | </note> | ||
| Line 171: | Line 189: | ||
| * http://www.brendangregg.com/perf.html | * http://www.brendangregg.com/perf.html | ||
| * https://www.oracle.com/tools/developerstudio/downloads/developer-studio-jsp.html | * https://www.oracle.com/tools/developerstudio/downloads/developer-studio-jsp.html | ||
| + | * https://guides.upb.ro/docs/grid/apptainer-usage | ||
| ==== Resources ==== | ==== Resources ==== | ||