Differences

This shows you the differences between two versions of the page.

Link to this comparison view

asc:laboratoare:04 [2026/03/24 02:44]
tudor.calafeteanu [Exercitii]
asc:laboratoare:04 [2026/03/26 14:24] (current)
emil.slusanschi [Reference]
Line 104: Line 104:
 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:​
   - Vă conectați pe ''​fep'',​ conform [[https://​ocw.cs.pub.ro/​courses/​asc/​laboratoare/​01|Laboratorului 1]] (Vezi ''​Ce este FEP-ul?​)''​.   - 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/​laboratoare/​lab4_skl.tar.gz -O lab4_skl.tar.gz'' ​- Downloadați 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'' ​- Dezarhivați arhiva downloadată mai sus+  - Dezarhivați arhiva downloadată mai sus: ''​tar -xzvf lab4_skl.tar.gz''​. 
-  - ''​%%srun --pty bash%%'' ​- intrați în mod interactiv pe Haswell+  - 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%%'' ​- Accesați imaginea de docker în 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**  - Folositi Callgrind pentru ''​task0.c'',​ urmărind TODO-urile din cod. **Task 0**  - Folositi Callgrind pentru ''​task0.c'',​ urmărind TODO-urile din cod.
-    * ''​make task0''​ pentru versiunea serială. 
-    * ''​make openmp_task0''​ pentru versiunea paralelizată. 
- 
 <code sh> <code sh>
 # Versiunea serială # Versiunea serială
 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>​ callgrind_annotate callgrind.out.<​pid> ​| less+Apptainer>​ callgrind_annotate callgrind.out.<​pid>​
  
 # Versiunea paralelizată # Versiunea paralelizată
Line 123: Line 120:
 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>​ callgrind_annotate callgrind.out.<​pid> ​| less+Apptainer>​ callgrind_annotate callgrind.out.<​pid>​
 </​code>​ </​code>​
  
Line 132: Line 129:
  
 **Task 1**  - Analizati aplicatia Tachyon (ray tracer). **Task 1**  - Analizati aplicatia Tachyon (ray tracer).
-    * Rulați scriptul ''​task1.sh''​ pentru a descărca și compila Tachyon. Atenție, trebuie să rulați pe fep scriptul task1.sh, pentru că doar aici aveți disponibilă libX11.so, de care aveți nevoie pentru compilare. Pe mașinile proprii aveți de asemenea nevoie de libX11.so, așa încât e bine să îl instalați înainte de rularea acestui task. 
  
 <code sh> <code sh>
-# Pe fep, înainte de srun: +Apptainer> ​./task1.sh
-[fep]$ ​./task1.sh+
  
-Pe nodul de calcul, în container: +Versiunea serială 
-[@haswell-wn01 ~]$ apptainer run docker://​gitlab.cs.pub.ro:​5050/​asc/​asc-public/c-labs:1.3.1 /bin/bash +Apptainer>​ valgrind ​--tool=callgrind --collect-jumps=yes --dump-instr=yes --collect-systime=yes -- ./tachyon_find_hotspots dat/balls.dat 
-Apptainer> ​cd tachyon +Apptainer> ​callgrind_annotate callgrind.out.<pid>
-Apptainer>​ export LD_LIBRARY_PATH=tbbforexamples/​linux/​4.0.1/​intel64/​cc4.1.0_libc2.4_kernel2.6.16.21/​lib:​$LD_LIBRARY_PATH+
  
-# Versiunea serială (atenție: durează ~5-10 minute sub Valgrind) +# Versiunea paralelizată 
-Apptainer>​ valgrind --tool=callgrind --collect-jumps=yes --dump-instr=yes \ +Apptainer>​ valgrind --tool=callgrind --collect-jumps=yes --dump-instr=yes --collect-systime=yes -- ./​tachyon_analyze_locks dat/​balls.dat 
-           ​--collect-systime=yes -- ./​tachyon_find_hotspots dat/​balls.dat +Apptainer>​ callgrind_annotate callgrind.out.<​pid>​
-Apptainer>​ callgrind_annotate callgrind.out.<​pid>​ | less +
- +
-# Versiunea paralelizată ​(atenție: durează ~3-5 minute sub Valgrind) +
-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> ​| less+
  
 # Perf (doar software counters în container) # Perf (doar software counters în container)
Line 158: Line 146:
 </​code>​ </​code>​
  
-    ​Varianta seriala ''​tachyon_find_hotspots''​ +Notați și explicați următoarele observații:​ 
-    Varianta paralelizata ​''​tachyon_analyze_locks''​ +  ​Care sunt funcțiile cu cel mai mare număr de instrucțiuni în versiunea serială? 
-    <code sh> +  Ce funcție consumă cel mai mult din versiunea serială și de ce? (hint: ​''​initialize_2D_buffer''​) 
-[@fep ~]$ ./task1.sh  +  Cum diferă profiling-ul serial de cel paralel? Ce funcții noi apar? 
-[@fep ]$ srun --time 00:05:00 --x11 -p haswell --pty /bin/bash +  * Unde este plasat mutex-ul în ''​analyze_locks''?​ Este necesar acolo?
-[@haswell-wn01 ~]$ apptainer run docker://​gitlab.cs.pub.ro:​5050/​asc/​asc-public/​c-labs:​1.3.1 /bin/bash +
-Apptainer>​ cd tachyon +
-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_analyze_locks dat/​balls.dat +
-</​code>​ +
-    * Analizati cu perf +
  
-**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ăriCare mod este mai eficient din punct de vedere al cache-ului și de ce? 
 +  * Comparați valorile ​''​LLd miss rate'' ​între cele 3 ordonăriCe 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 203: 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 ====
asc/laboratoare/04.1774313040.txt.gz · Last modified: 2026/03/24 02:44 by tudor.calafeteanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0