Table of Contents

Tema 3

  • Deadline soft: 23 mai 2024, ora 23:55.
  • Primiți un bonus de 10% din punctajul obținut pentru trimiterea temei înainte de 20 mai 2024, ora 23:55.
  • Deadline hard: 26 mai 2024, ora 23:55.
  • Veți primi o depunctare de 10% din punctajul maxim al temei pentru fiecare zi de întârziere (după 23 mai), până la maxim 3 zile, adică până pe 26 mai 2024, ora 23:55.

  • Dată publicare: 10 mai 2024
  • Dată actualizare enunț: 23 mai 2024

Enunț

Se dă următoarea operație cu matrice:

$$ C = (A^t \times B + B \times A) \times B^t $$

unde:

Se dorește implementarea expresiei de mai sus folosind limbajele C/C++, în 3 moduri:

Fiecare din cele 3 implementări de mai sus va ține cont de faptul că A este o matrice superior triunghiulară.

Rulare și testare

Pentru testarea temei vă este oferit un schelet de cod pe care trebuie să-l completați cu implementările celor 3 variante menționate mai sus. Scheletul de cod este structurat astfel:

Puteți aduce orice modificare scheletului de cod exceptând cele 3 fișiere menționate mai sus.

În urma rulării comenzii make vor rezulta 3 fișere binare, tema3_blas, tema3_neopt și tema3_opt_m corespunzătoare celor 3 variante care trebuie implementate.

Rularea se va realiza astfel:

./tema3_<mod> input 

unde:

  • mod este unul din modurile blas, neopt, opt_m
  • input este fișierul ce contine descrierea testelor.

Fișierul input este structurat astfel:

Rularea se va face pe partiția haswell folosind sbatch. Compilarea se va face folosind gcc-8.5.0.

Pentru a vedea cat de incarcate sunt nodurile puteti folosi scontrol:

[vlad.spoiala@fep8 sol]$ for node in haswell-wn{29..40}; do echo -n $node; scontrol show node $node | grep CPU; done
haswell-wn29   CPUAlloc=20 CPUTot=32 CPULoad=13.62
haswell-wn30   CPUAlloc=18 CPUTot=32 CPULoad=4.19
haswell-wn31   CPUAlloc=18 CPUTot=32 CPULoad=3.76
haswell-wn32   CPUAlloc=18 CPUTot=32 CPULoad=3.79
haswell-wn33   CPUAlloc=18 CPUTot=32 CPULoad=3.76
haswell-wn34   CPUAlloc=18 CPUTot=32 CPULoad=3.79
haswell-wn35   CPUAlloc=18 CPUTot=32 CPULoad=3.75
haswell-wn36   CPUAlloc=18 CPUTot=32 CPULoad=3.88
haswell-wn37   CPUAlloc=18 CPUTot=32 CPULoad=3.76
haswell-wn38   CPUAlloc=18 CPUTot=32 CPULoad=3.87
haswell-wn39   CPUAlloc=18 CPUTot=32 CPULoad=3.95
haswell-wn40   CPUAlloc=18 CPUTot=32 CPULoad=3.47

Pentru a evita rularea pe nodurile incarcate puteti folosi optiunea –exclude din sbatch. De exemplu, pentru a nu rula pe nodurile 29 si 30 putem folosi sbatch in felul urmator:

[vlad.spoiala@fep8 sol]$ sbatch -p haswell --time 00:03:00 --exclude=haswell-wn[29-30] test_all_opt.sh
Submitted batch job 471560

Jobul ruleaza pe haswell-wn31:

[vlad.spoiala@fep8 sol]$ squeue -u vlad.spoiala
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
            471560   haswell test_all vlad.spo  R       0:06      1 haswell-wn31

Testele voastre de performanță trebuie realizate pe partiția haswell deoarece evaluarea temelor se va face pe această partiție.

Fisierul input contine 3 teste:

3
400 123 out1
800 456 out2
1200 789 out3

În cazul fișierului input avem 3 teste pentru urmatoarele valori ale lui N: 400, 800, respectiv 1200. Seed-urile folosite la generarea datelor de intrare sunt 123, 456, respectiv 789. Fișierele de output sunt out1, out2, respectiv out3.

Pentru a fi luată în considerare la punctaj, implementarea trebuie să producă rezultate corecte pe toate cele 3 teste din fișierul input.

Fișierul input_valgrind ce va fi folosit pentru rulările de valgrind contine un singur test:

1
400 123 out1

Punctaj

Punctajul este impărțit astfel:

Depunctări posibile:

Precizări încărcare / Moodle

Arhiva temei va fi încărcată pe Moodle.

Structura arhivei va fi următoarea:

src
  solver_blas.c       
  solver_neopt.c      
  solver_opt.c        
  ...           
cache
  blas.cache        
  neopt.cache       
  opt_m.cache       
memory
  opt_m.memory     
  neopt.memory     
  blas.memory   
README
grafice
  ...

La încărcarea pe Moodle vor fi verificate următoarele:

Celelalte aspecte ale temei (README, grafice) vor fi verificate ulterior.

Precizări și recomandări

Pentru a evita aglomerarea cozii se recomandă rularea de teste pentru valori ale lui N mai mici sau egale cu 1600.

Se recomandă ștergerea fișierelor coredump în cazul rulărilor care se termină cu eroare pentru a evita problemele cu spațiul de stocare.

În cazul în care job-urile vă rămân “agățate”, va recomandam să utilizați de pe fep.grid.pub.ro, comanda

 squeue 

pentru a vedea câte job-uri aveți pornite, și apoi să utilizați comanda

scancel <job_id> 

pentru a opri un job.

Pentru întrebări sau nelămuriri legate de temă folosiți forumul temei.

Orice întrebare e recomandat să conțină o descriere cât mai clară a eventualei probleme. Întrebări de forma: “Nu merge X. De ce?” fără o descriere mai amănunțită vor primi un răspuns mai greu.

ATENȚIE să nu postați imagini cu părți din soluția voastră pe forumul pus la dispoziție sau orice alt canal public de comunicație. Dacă veți face acest lucru, vă asumați răspunderea dacă veți primi copiat pe temă.

Temele vor fi testate împotriva plagiatului. Orice tentativă de copiere va fi depunctată conform regulamentului. Rezultatele notării automate este orientativă și poate fi afectată de corectarea manuală.

Resurse necesare realizării temei

Pentru a clona repo-ul și a accesa resursele temei 3:

student@asc:~$ git clone https://gitlab.cs.pub.ro/asc/asc-public.git
student@asc:~$ cd asc-public/assignments/3-optimizari

Pentru a valida corectitudinea rezultatelor puteti folosi fisierele output referinta din directorul references.